Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~

Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。

文件存储我就不用多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android高手进阶教程(七)之----Android 中Preferences的使用!

今天我们将讲一下SQLiteDatabase的使用而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石

为了让大家更好的掌握,我们手把手完成该节的Demo

第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:

  1. packagecom.android.tutor;
  2. importandroid.content.ContentValues;
  3. importandroid.content.Context;
  4. importandroid.database.Cursor;
  5. importandroid.database.sqlite.SQLiteDatabase;
  6. importandroid.database.sqlite.SQLiteOpenHelper;
  7. publicclassBooksDBextendsSQLiteOpenHelper{
  8. privatefinalstaticStringDATABASE_NAME="BOOKS.db";
  9. privatefinalstaticintDATABASE_VERSION=1;
  10. privatefinalstaticStringTABLE_NAME="books_table";
  11. publicfinalstaticStringBOOK_ID="book_id";
  12. publicfinalstaticStringBOOK_NAME="book_name";
  13. publicfinalstaticStringBOOK_AUTHOR="book_author";
  14. publicBooksDB(Contextcontext){
  15. //TODOAuto-generatedconstructorstub
  16. super(context,DATABASE_NAME,null,DATABASE_VERSION);
  17. }
  18. //创建table
  19. @Override
  20. publicvoidonCreate(SQLiteDatabasedb){
  21. Stringsql="CREATETABLE"+TABLE_NAME+"("+BOOK_ID
  22. +"INTEGERprimarykeyautoincrement,"+BOOK_NAME+"text,"+BOOK_AUTHOR+"text);";
  23. db.execSQL(sql);
  24. }
  25. @Override
  26. publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
  27. Stringsql="DROPTABLEIFEXISTS"+TABLE_NAME;
  28. db.execSQL(sql);
  29. onCreate(db);
  30. }
  31. publicCursorselect(){
  32. SQLiteDatabasedb=this.getReadableDatabase();
  33. Cursorcursor=db
  34. .query(TABLE_NAME,null,null,null,null,null,null);
  35. returncursor;
  36. }
  37. //增加操作
  38. publiclonginsert(Stringbookname,Stringauthor)
  39. {
  40. SQLiteDatabasedb=this.getWritableDatabase();
  41. /*ContentValues*/
  42. ContentValuescv=newContentValues();
  43. cv.put(BOOK_NAME,bookname);
  44. cv.put(BOOK_AUTHOR,author);
  45. longrow=db.insert(TABLE_NAME,null,cv);
  46. returnrow;
  47. }
  48. //删除操作
  49. publicvoiddelete(intid)
  50. {
  51. SQLiteDatabasedb=this.getWritableDatabase();
  52. Stringwhere=BOOK_ID+"=?";
  53. String[]whereValue={Integer.toString(id)};
  54. db.delete(TABLE_NAME,where,whereValue);
  55. }
  56. //修改操作
  57. publicvoidupdate(intid,Stringbookname,Stringauthor)
  58. {
  59. SQLiteDatabasedb=this.getWritableDatabase();
  60. Stringwhere=BOOK_ID+"=?";
  61. String[]whereValue={Integer.toString(id)};
  62. ContentValuescv=newContentValues();
  63. cv.put(BOOK_NAME,bookname);
  64. cv.put(BOOK_AUTHOR,author);
  65. db.update(TABLE_NAME,cv,where,whereValue);
  66. }
  67. }

第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditText
  8. android:id="@+id/bookname"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. >
  12. </EditText>
  13. <EditText
  14. android:id="@+id/author"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. >
  18. </EditText>
  19. <ListView
  20. android:id="@+id/bookslist"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. >
  24. </ListView>
  25. </LinearLayout>

第四步:修改SQLiteDatabaseDemo.java代码如下:

  1. packagecom.android.tutor;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.database.Cursor;
  5. importandroid.os.Bundle;
  6. importandroid.view.Menu;
  7. importandroid.view.MenuItem;
  8. importandroid.view.View;
  9. importandroid.view.ViewGroup;
  10. importandroid.widget.AdapterView;
  11. importandroid.widget.BaseAdapter;
  12. importandroid.widget.EditText;
  13. importandroid.widget.ListView;
  14. importandroid.widget.TextView;
  15. importandroid.widget.Toast;
  16. publicclassSQLiteDatabaseDemoextendsActivityimplementsAdapterView.OnItemClickListener{
  17. privateBooksDBmBooksDB;
  18. privateCursormCursor;
  19. privateEditTextBookName;
  20. privateEditTextBookAuthor;
  21. privateListViewBooksList;
  22. privateintBOOK_ID=0;
  23. protectedfinalstaticintMENU_ADD=Menu.FIRST;
  24. protectedfinalstaticintMENU_DELETE=Menu.FIRST+1;
  25. protectedfinalstaticintMENU_UPDATE=Menu.FIRST+2;
  26. publicvoidonCreate(BundlesavedInstanceState){
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.main);
  29. setUpViews();
  30. }
  31. publicvoidsetUpViews(){
  32. mBooksDB=newBooksDB(this);
  33. mCursor=mBooksDB.select();
  34. BookName=(EditText)findViewById(R.id.bookname);
  35. BookAuthor=(EditText)findViewById(R.id.author);
  36. BooksList=(ListView)findViewById(R.id.bookslist);
  37. BooksList.setAdapter(newBooksListAdapter(this,mCursor));
  38. BooksList.setOnItemClickListener(this);
  39. }
  40. @Override
  41. publicbooleanonCreateOptionsMenu(Menumenu){
  42. super.onCreateOptionsMenu(menu);
  43. menu.add(Menu.NONE,MENU_ADD,0,"ADD");
  44. menu.add(Menu.NONE,MENU_DELETE,0,"DELETE");
  45. menu.add(Menu.NONE,MENU_DELETE,0,"UPDATE");
  46. returntrue;
  47. }
  48. publicbooleanonOptionsItemSelected(MenuItemitem)
  49. {
  50. super.onOptionsItemSelected(item);
  51. switch(item.getItemId())
  52. {
  53. caseMENU_ADD:
  54. add();
  55. break;
  56. caseMENU_DELETE:
  57. delete();
  58. break;
  59. caseMENU_UPDATE:
  60. update();
  61. break;
  62. }
  63. returntrue;
  64. }
  65. publicvoidadd(){
  66. Stringbookname=BookName.getText().toString();
  67. Stringauthor=BookAuthor.getText().toString();
  68. //书名和作者都不能为空,或者退出
  69. if(bookname.equals("")||author.equals("")){
  70. return;
  71. }
  72. mBooksDB.insert(bookname,author);
  73. mCursor.requery();
  74. BooksList.invalidateViews();
  75. BookName.setText("");
  76. BookAuthor.setText("");
  77. Toast.makeText(this,"AddSuccessed!",Toast.LENGTH_SHORT).show();
  78. }
  79. publicvoiddelete(){
  80. if(BOOK_ID==0){
  81. return;
  82. }
  83. mBooksDB.delete(BOOK_ID);
  84. mCursor.requery();
  85. BooksList.invalidateViews();
  86. BookName.setText("");
  87. BookAuthor.setText("");
  88. Toast.makeText(this,"DeleteSuccessed!",Toast.LENGTH_SHORT).show();
  89. }
  90. publicvoidupdate(){
  91. Stringbookname=BookName.getText().toString();
  92. Stringauthor=BookAuthor.getText().toString();
  93. //书名和作者都不能为空,或者退出
  94. if(bookname.equals("")||author.equals("")){
  95. return;
  96. }
  97. mBooksDB.update(BOOK_ID,bookname,author);
  98. mCursor.requery();
  99. BooksList.invalidateViews();
  100. BookName.setText("");
  101. BookAuthor.setText("");
  102. Toast.makeText(this,"UpdateSuccessed!",Toast.LENGTH_SHORT).show();
  103. }
  104. @Override
  105. publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){
  106. mCursor.moveToPosition(position);
  107. BOOK_ID=mCursor.getInt(0);
  108. BookName.setText(mCursor.getString(1));
  109. BookAuthor.setText(mCursor.getString(2));
  110. }
  111. publicclassBooksListAdapterextendsBaseAdapter{
  112. privateContextmContext;
  113. privateCursormCursor;
  114. publicBooksListAdapter(Contextcontext,Cursorcursor){
  115. mContext=context;
  116. mCursor=cursor;
  117. }
  118. @Override
  119. publicintgetCount(){
  120. returnmCursor.getCount();
  121. }
  122. @Override
  123. publicObjectgetItem(intposition){
  124. returnnull;
  125. }
  126. @Override
  127. publiclonggetItemId(intposition){
  128. return0;
  129. }
  130. @Override
  131. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  132. TextViewmTextView=newTextView(mContext);
  133. mCursor.moveToPosition(position);
  134. mTextView.setText(mCursor.getString(1)+"___"+mCursor.getString(2));
  135. returnmTextView;
  136. }
  137. }
  138. }

第五步:运行程序效果如下:

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。

另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

由于代码都是现写,时间原因,没有全部加注释,如果大家 有什么不懂的地方,可以留言,我会尽快答复,如果需源代码,请留下你的Email

地址,ok,今天就到这里,大家晚安!