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

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

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

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

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

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

packagecom.android.tutor; importandroid.content.ContentValues; importandroid.content.Context; importandroid.database.Cursor; importandroid.database.sqlite.SQLiteDatabase; importandroid.database.sqlite.SQLiteOpenHelper; publicclassBooksDBextendsSQLiteOpenHelper { privatefinalstaticString DATABASE_NAME ="BOOKS.db"; privatefinalstaticintDATABASE_VERSION =1; privatefinalstaticString TABLE_NAME ="books_table"; publicfinalstaticString BOOK_ID ="book_id"; publicfinalstaticString BOOK_NAME ="book_name"; publicfinalstaticString BOOK_AUTHOR ="book_author"; publicBooksDB(Context context) { // TODO Auto-generated constructor stub super(context, DATABASE_NAME,null, DATABASE_VERSION); } // 创建table @Override publicvoidonCreate(SQLiteDatabase db) { String sql ="CREATE TABLE "+ TABLE_NAME +" ("+ BOOK_ID +" INTEGER primary key autoincrement, "+ BOOK_NAME +" text, "+ BOOK_AUTHOR +" text);"; db.execSQL(sql); } @Override publicvoidonUpgrade(SQLiteDatabase db,intoldVersion,intnewVersion) { String sql ="DROP TABLE IF EXISTS "+ TABLE_NAME; db.execSQL(sql); onCreate(db); } publicCursor select() { SQLiteDatabase db =this.getReadableDatabase(); Cursor cursor = db .query(TABLE_NAME,null,null,null,null,null,null); returncursor; } // 增加操作 publiclonginsert(String bookname, String author) { SQLiteDatabase db =this.getWritableDatabase(); /* ContentValues */ ContentValues cv =newContentValues(); cv.put(BOOK_NAME, bookname); cv.put(BOOK_AUTHOR, author); longrow = db.insert(TABLE_NAME,null, cv); returnrow; } // 删除操作 publicvoiddelete(intid) { SQLiteDatabase db =this.getWritableDatabase(); String where = BOOK_ID +" = ?"; String[] whereValue = { Integer.toString(id) }; db.delete(TABLE_NAME, where, whereValue); } // 修改操作 publicvoidupdate(intid, String bookname, String author) { SQLiteDatabase db =this.getWritableDatabase(); String where = BOOK_ID +" = ?"; String[] whereValue = { Integer.toString(id) }; ContentValues cv =newContentValues(); cv.put(BOOK_NAME, bookname); cv.put(BOOK_AUTHOR, author); db.update(TABLE_NAME, cv, where, whereValue); } }

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

<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:id="@+id/bookname" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/author" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/bookslist" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

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

packagecom.android.tutor; importandroid.app.Activity; importandroid.content.Context; importandroid.database.Cursor; importandroid.os.Bundle; importandroid.view.Menu; importandroid.view.MenuItem; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.AdapterView; importandroid.widget.BaseAdapter; importandroid.widget.EditText; importandroid.widget.ListView; importandroid.widget.TextView; importandroid.widget.Toast; publicclassSQLiteDatabaseDemoextendsActivityimplements AdapterView.OnItemClickListener { privateBooksDB mBooksDB; privateCursor mCursor; privateEditText BookName; privateEditText BookAuthor; privateListView BooksList; privateintBOOK_ID =0; protectedfinalstaticintMENU_ADD = Menu.FIRST; protectedfinalstaticintMENU_DELETE = Menu.FIRST +1; protectedfinalstaticintMENU_UPDATE = Menu.FIRST +2; publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setUpViews(); } publicvoidsetUpViews() { mBooksDB =newBooksDB(this); mCursor = mBooksDB.select(); BookName = (EditText) findViewById(R.id.bookname); BookAuthor = (EditText) findViewById(R.id.author); BooksList = (ListView) findViewById(R.id.bookslist); BooksList.setAdapter(newBooksListAdapter(this, mCursor)); BooksList.setOnItemClickListener(this); } @Override publicbooleanonCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, MENU_ADD,0,"ADD"); menu.add(Menu.NONE, MENU_DELETE,0,"DELETE"); menu.add(Menu.NONE, MENU_DELETE,0,"UPDATE"); returntrue; } publicbooleanonOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch(item.getItemId()) { caseMENU_ADD: add(); break; caseMENU_DELETE: delete(); break; caseMENU_UPDATE: update(); break; } returntrue; } publicvoidadd() { String bookname = BookName.getText().toString(); String author = BookAuthor.getText().toString(); // 书名和作者都不能为空,或者退出 if(bookname.equals("") || author.equals("")) { return; } mBooksDB.insert(bookname, author); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this,"Add Successed!", Toast.LENGTH_SHORT).show(); } publicvoiddelete() { if(BOOK_ID ==0) { return; } mBooksDB.delete(BOOK_ID); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this,"Delete Successed!", Toast.LENGTH_SHORT).show(); } publicvoidupdate() { String bookname = BookName.getText().toString(); String author = BookAuthor.getText().toString(); // 书名和作者都不能为空,或者退出 if(bookname.equals("") || author.equals("")) { return; } mBooksDB.update(BOOK_ID, bookname, author); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this,"Update Successed!", Toast.LENGTH_SHORT).show(); } @Override publicvoidonItemClick(AdapterView<?> parent, View view,intposition, longid) { mCursor.moveToPosition(position); BOOK_ID = mCursor.getInt(0); BookName.setText(mCursor.getString(1)); BookAuthor.setText(mCursor.getString(2)); } publicclassBooksListAdapterextendsBaseAdapter { privateContext mContext; privateCursor mCursor; publicBooksListAdapter(Context context, Cursor cursor) { mContext = context; mCursor = cursor; } @Override publicintgetCount() { returnmCursor.getCount(); } @Override publicObject getItem(intposition) { returnnull; } @Override publiclonggetItemId(intposition) { return0; } @Override publicView getView(intposition, View convertView, ViewGroup parent) { TextView mTextView =newTextView(mContext); mCursor.moveToPosition(position); mTextView.setText(mCursor.getString(1) +"___" + mCursor.getString(2)); returnmTextView; } } }

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

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

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


更多相关文章

  1. 安卓设备修改屏幕像素密度以及查看屏幕分辨率
  2. 【odroid-xu3】 ODROID-XU3软件环境搭建记录
  3. Android(安卓)studio -SVN 使用笔记
  4. Android(安卓)Audio代码分析7 - stream type
  5. android透明activity
  6. android4.4修改低电压提醒
  7. 解析Android中使用自定义字体的实现方法
  8. Android(安卓)中Preferences的使用!
  9. YUV420P的格式以及转换为RGB565的代码(Android摄像头的输出一般为

随机推荐

  1. Android(安卓)Inflate
  2. Android编译系统详解(三)
  3. Android(安卓)SharedPreferences的使用
  4. ERROR: Application requires API versio
  5. Android啓動其他app的Activity
  6. Android之存储
  7. android自动化测试框架
  8. Android通知
  9. Android简明开发教程十六:Button 画刷示例
  10. android switch语句case expressions mus