android學習之通過sqlite資料庫實現記事本
阿新 • • 發佈:2019-02-19
最近學習了資料庫,於是寫了一個記事本來體驗了一下資料庫因為最近的事情比較多,所以介面或者有些設計不是那麼完美,但是作為一個可擴充套件的筆記本demo也已經是足夠了,這個例子實現的是,可以註冊多個使用者,然後每個使用者都對應有一個記事本記錄,ok,程式碼:
package com.example.logindemo2; import com.jk.dao.SqlistBase; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Note; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { SqlistBase mdatabase; SQLiteDatabase db; ContentValues cv; Button btn_login, btn_register; EditText et_name, et_pwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 建立資料庫物件 init(); } private void init() { //找到對應的控制元件對應的id btn_login = (Button) findViewById(R.id.btn_login); btn_register = (Button) findViewById(R.id.btn_register); et_name = (EditText) findViewById(R.id.name); et_pwd = (EditText) findViewById(R.id.key); //初始化SqlistBase物件 mdatabase = new SqlistBase(this); //得到對應的資料庫讀寫物件 db = mdatabase.getWritableDatabase(); //獲得一個可以儲存資料的物件 cv = new ContentValues(); //設定監聽事件 btn_login.setOnClickListener(this); btn_register.setOnClickListener(this); } @Override public void onClick(View v) { //對點選事件進行判斷 switch (v.getId()) { case R.id.btn_login: login(); break; case R.id.btn_register: register(); break; } } private void register() { Intent intent = new Intent(MainActivity.this, RegisterActivity.class); startActivity(intent); } private void login() { //通過控制元件獲得輸入的文字資訊 String name=et_name.getText().toString(); String pwd=et_pwd.getText().toString(); //查詢的鍵的封裝 String col[]={SqlistBase.ACCOUNT,SqlistBase.PWD}; //獲得遍歷的遊標 Cursor cur=db.query(SqlistBase.USER_TABLE_NAME, col, null, null, null, null, null); while(cur.moveToNext()){ //通過遊標獲得資料庫裡面的資料 String namedata=cur.getString(0); String pwddata=cur.getString(1); //判斷是否和資料庫裡面的內容是否相等 if((namedata.equals(name))&&(pwddata.equals(pwd))){ Toast.makeText(this, "登入成功", Toast.LENGTH_SHORT).show(); Bundle bundle=new Bundle(); bundle.putString(SqlistBase.ACCOUNT,namedata); //在不同的包下面跳轉需要加上包名 Intent intent=new Intent(this,com.jk.note.Note.class); intent.putExtras(bundle); startActivity(intent); } } } }
package com.example.logindemo2; import com.jk.dao.SqlistBase; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class RegisterActivity extends Activity { //宣告一個可以讀寫的資料庫 SQLiteDatabase db; //申明自己定義的資料庫建立的物件 SqlistBase mdatabase; //獲得一個可以儲存資料的ContentValues封裝物件 ContentValues myContentValus; Button btn_register_check; EditText et_name_register,et_pwd_register,et_checkpwd_register; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); init(); btn_register_check.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //通過控制元件獲得文字的輸入的資訊 String name=et_name_register.getText().toString(); String pwd=et_pwd_register.getText().toString(); String checkpwd=et_checkpwd_register.getText().toString(); if(name.equals("")){ Toast.makeText(RegisterActivity.this,"賬戶名不能為空", Toast.LENGTH_SHORT).show(); }else if(pwd.equals("")){ Toast.makeText(RegisterActivity.this,"密碼不能為空", Toast.LENGTH_SHORT).show(); }else if(!pwd.equals(checkpwd)){ Toast.makeText(RegisterActivity.this,"兩次輸入的密碼不同", Toast.LENGTH_SHORT).show(); }else if(pwd.equals(checkpwd)){ Toast.makeText(RegisterActivity.this,"註冊成功", Toast.LENGTH_SHORT).show(); //將合法的資料寫入資料庫 //獲得自己寫的資料庫的物件 mdatabase=new SqlistBase(RegisterActivity.this); //獲得可以的資料庫 db=mdatabase.getWritableDatabase(); //獲得可以儲存資料的ContentValues物件。 myContentValus=new ContentValues(); myContentValus.put(SqlistBase.ACCOUNT,name); myContentValus.put(SqlistBase.PWD,pwd); db.insert(SqlistBase.USER_TABLE_NAME, null, myContentValus); ContentValues myContentValus1 = new ContentValues(); //寫入完成以後關閉資料庫 db.close(); RegisterActivity.this.finish(); } } }); } private void init() { //找到對應控制元件的id btn_register_check=(Button) findViewById(R.id.btn_register_check); et_name_register=(EditText) findViewById(R.id.name_register); et_pwd_register=(EditText) findViewById(R.id.key_register); et_checkpwd_register=(EditText) findViewById(R.id.check_key_register); } }
package com.jk.note; import java.util.Calendar; import com.example.logindemo2.R; import com.jk.dao.SqlistBase; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ListActivity; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class Note extends ListActivity implements OnItemLongClickListener { //設定資料庫裡面對應的欄位的名字 public static final String TITLE = "title"; public static final String BODY = "body"; public static final String TIME = "created"; public static final String NTID = "_id"; //申明一個數據庫 public static SQLiteDatabase db; //一個遊標 public Cursor cursor; //當前的使用者 public static String currentAccount; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_note); //得到當前登入的賬戶 String account = getIntent().getExtras().getString(SqlistBase.ACCOUNT); //將當前的賬戶的名字設定為標題 setTitle(account); //構建當前使用者的表名 currentAccount = "diary" + account; //獲得資料庫物件 db = Note.this.openOrCreateDatabase("userdatabase.db", MODE_PRIVATE, null); //讀取列表 readlist(); //例項化ListView ListView lv = this.getListView(); //為lv設定長按監聽事件 lv.setOnItemLongClickListener(this); } public void readlist() { try { //如果資料庫中存在當前物件,那麼就查詢 cursor = db.query(true, currentAccount, new String[] { NTID, TITLE, BODY, TIME }, null, null, null, null, null, null); } catch (Exception e) { //如果資料庫中不存在當前物件就建立 String sql2 = "create table " + currentAccount + "(" + NTID + " integer primary key autoincrement, " + TITLE + " text not null, " + BODY + " text not null, " + TIME + " text not null" + ");"; db.execSQL(sql2); cursor = db.query(true, currentAccount, new String[] { NTID, TITLE, BODY, TIME }, null, null, null, null, null, null); } //將cursor和系統連線起來 startManagingCursor(cursor); //需要查詢的資料 String[] from = new String[] { TITLE, TIME }; //查詢的資料的顯示格式 int[] to = new int[] { R.id.tv_title, R.id.tv_time }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.note_row, cursor, from, to); setListAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //為選單新增一個點選按鈕的 menu.add(0, 0, 0, "新增日記"); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { //響應事件 if (item.getItemId() == 0) { createDiary(); } return true; } private void createDiary() { //建立一個日誌,主要是跳轉到編輯介面 Intent intent = new Intent(this, NoteEdit.class); startActivity(intent); } public void createDiary(String title, String body) { //獲得一個cv來儲存資料 ContentValues cv = new ContentValues(); cv.put(TITLE, title); cv.put(BODY, body); Calendar calendar = Calendar.getInstance(); String time = calendar.get(Calendar.MONTH + 1) + "月" + calendar.get(Calendar.DAY_OF_MONTH) + "日" + calendar.get(Calendar.HOUR_OF_DAY) + "時"; cv.put(TIME, time); //將資料寫入資料庫之中 db.insert(currentAccount, null, cv); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); //獲得遊標 Cursor mycursor=cursor; //將目標移動到點選的位置 mycursor.move(position); Intent intent=new Intent(this,NoteEdit.class); intent.putExtra(NTID, id); intent.putExtra(TITLE, mycursor.getString(mycursor.getColumnIndexOrThrow(TITLE))); intent.putExtra(BODY, mycursor.getString(mycursor.getColumnIndexOrThrow(BODY))); //用帶有資料的intent啟動activity startActivityForResult(intent,1); } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //長按以後直接刪除,這裡本來應該是彈出對話方塊的,但是最近事情有點多,朋友就自己去新增吧 db.delete(currentAccount, NTID+"="+arg3,null); //重新整理 readlist(); return false; } public void updataDiary(Long rowid, String title2, String body2) { ContentValues cv = new ContentValues(); //同樣創一個cv來儲存資料 cv.put(TITLE, title2); cv.put(BODY, body2); Calendar calendar = Calendar.getInstance(); String time = calendar.get(Calendar.MONTH + 1) + "月" + calendar.get(Calendar.DAY_OF_MONTH) + "日" + calendar.get(Calendar.HOUR_OF_DAY) + "時"; cv.put(TIME, time); //更新資料庫 db.update(currentAccount, cv, NTID+"="+rowid,null); } }
package com.jk.note;
import com.example.logindemo2.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class NoteEdit extends Activity {
//申明需要的一些控制元件
EditText et_title,et_body;
Button btn_confirm,btn_cancle;
public Note currentNote;
String title,body;
public Long rowid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.noto_edit);
//初始化
init();
}
public void init(){
//例項化一個Note物件
currentNote=new Note();
//繫結控制元件
et_title=(EditText) findViewById(R.id.et_title);
et_body=(EditText) findViewById(R.id.et_body);
btn_confirm=(Button) findViewById(R.id.btn_confirm);
btn_cancle=(Button) findViewById(R.id.btn_cancle);
//如果bundle不為空,得到資料並顯示在介面
Bundle bundle=getIntent().getExtras();
if(bundle!=null){
title=bundle.getString(Note.TITLE);
body=bundle.getString(Note.BODY);
if(title!=null){
et_title.setText(title);
}
if(body!=null){
et_body.setText(body);
}
//得到傳入的id
rowid=bundle.getLong(Note.NTID);
}
}
//對不同的事件進行不同的響應
public void onMyClick(View v){
switch(v.getId()){
case R.id.btn_confirm:
save();
break;
case R.id.btn_cancle:
finish();
break;
}
}
//
private void save() {
String title=et_title.getText().toString();
String body=et_body.getText().toString();
if(rowid!=null){
//如果id不為空,那麼就更新
currentNote.updataDiary(rowid,title,body);
}else{
//如果id為空,那麼就建立
currentNote.createDiary(title, body);
}
Intent mintent=new Intent();
setResult(RESULT_OK, mintent);
finish();
}
}
佈局:
主介面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="使用者名稱"/>
<EditText
android:id="@+id/name"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:hint="請輸入使用者名稱"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密碼"/>
<EditText
android:id="@+id/key"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:hint="請輸入密碼"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_login"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="onMyClick"
android:text="登陸"/>
<Button
android:id="@+id/btn_register"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="onMyClick"
android:text="註冊"/>
</LinearLayout>
</LinearLayout>
註冊介面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="使用者名稱"/>
<EditText
android:id="@+id/name_register"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:hint="請輸入使用者名稱"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密碼"/>
<EditText
android:id="@+id/key_register"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:hint="請輸入密碼"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密碼"/>
<EditText
android:id="@+id/check_key_register"
android:layout_height="wrap_content"
android:layout_width="200dp"
android:hint="請確認密碼"/>
</LinearLayout>
<Button
android:id="@+id/btn_register_check"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="onMyClick"
android:text="註冊"/>
</LinearLayout>
顯示記事本的list<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ListView>
<TextView
android:id="@+id/android:empty"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="你還沒有開始寫日記,點選menu新增你的第一篇日記"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="第一組"/>
<TextView
android:id="@+id/tv_time"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="199年"/>
</LinearLayout>
記事本的編輯框:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_title"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="請輸入標題"
/>
<EditText
android:id="@+id/et_body"
android:layout_height="300dp"
android:layout_width="match_parent"
android:hint="請輸入內容"
/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/btn_confirm"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="onMyClick"
android:text="確定"/>
<Button
android:id="@+id/btn_cancle"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="onMyClick"
android:text="取消"/>
</LinearLayout>
</LinearLayout>
程式碼稍微有點多,大家耐心看一下。