1. 程式人生 > >android學習之通過sqlite資料庫實現記事本

android學習之通過sqlite資料庫實現記事本

最近學習了資料庫,於是寫了一個記事本來體驗了一下資料庫因為最近的事情比較多,所以介面或者有些設計不是那麼完美,但是作為一個可擴充套件的筆記本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>
程式碼稍微有點多,大家耐心看一下。