大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~
**Android *提供了三种数据存储方式,第一种是文件存储;第二种是**SharedPreferences**存储;第三种就是数据库**SQLiteDatabase**存储。
文件存储我就不用多说了,而**SharedPreferences**可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。[Android高手进阶教程(七)之----Android 中Preferences的使用!](http://blog.csdn.net/Android_Tutor/archive/2010/04/26/5531849.aspx)
今天我们将讲一下**SQLiteDatabase**的使用**。**而掌握**SqliteDatabase**,将会我们接下来掌握**ContentProvider**打下良好的基石**。**
为了让大家更好的掌握,我们手把手完成该节的**Demo**。
第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.
![](https://box.kancloud.cn/2016-08-10_57aae59828436.gif)
第二步:创建一个新的类**BooksDB.java**这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:
~~~
package com.android.tutor;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class BooksDB extends SQLiteOpenHelper { private final static String DATABASE_NAME = "BOOKS.db"; private final static int DATABASE_VERSION = 1; private final static String TABLE_NAME = "books_table"; public final static String BOOK_ID = "book_id"; public final static String BOOK_NAME = "book_name"; public final static String BOOK_AUTHOR = "book_author"; public BooksDB(Context context) { // TODO Auto-generated constructor stub super(context, DATABASE_NAME, null, DATABASE_VERSION); } //创建table @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID + " INTEGER primary key autoincrement, " + BOOK_NAME + " text, "+ BOOK_AUTHOR +" text);"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; db.execSQL(sql); onCreate(db); } public Cursor select() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db .query(TABLE_NAME, null, null, null, null, null, null); return cursor; } //增加操作 public long insert(String bookname,String author) { SQLiteDatabase db = this.getWritableDatabase(); /* ContentValues */ ContentValues cv = new ContentValues(); cv.put(BOOK_NAME, bookname); cv.put(BOOK_AUTHOR, author); long row = db.insert(TABLE_NAME, null, cv); return row; } //删除操作 public void delete(int id) { SQLiteDatabase db = this.getWritableDatabase(); String where = BOOK_ID + " = ?"; String[] whereValue ={ Integer.toString(id) }; db.delete(TABLE_NAME, where, whereValue); } //修改操作 public void update(int id, String bookname,String author) { SQLiteDatabase db = this.getWritableDatabase(); String where = BOOK_ID + " = ?"; String[] whereValue = { Integer.toString(id) }; ContentValues cv = new ContentValues(); cv.put(BOOK_NAME, bookname); cv.put(BOOK_AUTHOR, author); db.update(TABLE_NAME, cv, where, whereValue); }}
~~~
第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:
~~~
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns: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> <EditText android:id="@+id/author" android:layout_width="fill_parent" android:layout_height="wrap_content" > </EditText> <ListView android:id="@+id/bookslist" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
~~~
第四步:修改SQLiteDatabaseDemo.java代码如下:
~~~
package com.android.tutor;import android.app.Activity;import android.content.Context;import android.database.Cursor;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class SQLiteDatabaseDemo extends Activity implements AdapterView.OnItemClickListener { private BooksDB mBooksDB; private Cursor mCursor; private EditText BookName; private EditText BookAuthor; private ListView BooksList; private int BOOK_ID = 0; protected final static int MENU_ADD = Menu.FIRST; protected final static int MENU_DELETE = Menu.FIRST + 1; protected final static int MENU_UPDATE = Menu.FIRST + 2; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setUpViews(); } public void setUpViews(){ mBooksDB = new BooksDB(this); mCursor = mBooksDB.select(); BookName = (EditText)findViewById(R.id.bookname); BookAuthor = (EditText)findViewById(R.id.author); BooksList = (ListView)findViewById(R.id.bookslist); BooksList.setAdapter(new BooksListAdapter(this, mCursor)); BooksList.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(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"); return true; } public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case MENU_ADD: add(); break; case MENU_DELETE: delete(); break; case MENU_UPDATE: update(); break; } return true; } public void add(){ 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(); } public void delete(){ 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(); } public void update(){ 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 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mCursor.moveToPosition(position); BOOK_ID = mCursor.getInt(0); BookName.setText(mCursor.getString(1)); BookAuthor.setText(mCursor.getString(2)); } public class BooksListAdapter extends BaseAdapter{ private Context mContext; private Cursor mCursor; public BooksListAdapter(Context context,Cursor cursor) { mContext = context; mCursor = cursor; } @Override public int getCount() { return mCursor.getCount(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView mTextView = new TextView(mContext); mCursor.moveToPosition(position); mTextView.setText(mCursor.getString(1) + "___" + mCursor.getString(2)); return mTextView; } }}
~~~
第五步:运行程序效果如下:
![](https://box.kancloud.cn/2016-08-10_57aae5984b1fe.gif)
![](https://box.kancloud.cn/2016-08-10_57aae59864b9c.gif)
![](https://box.kancloud.cn/2016-08-10_57aae5987d157.gif)
![](https://box.kancloud.cn/2016-08-10_57aae5989e8fb.gif)
![](https://box.kancloud.cn/2016-08-10_57aae598bac1f.gif)
![](https://box.kancloud.cn/2016-08-10_57aae598d70f9.gif)
第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。
另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:
![](https://box.kancloud.cn/2016-08-10_57aae598f088b.gif)
由于代码都是现写,时间原因,没有全部加注释,如果大家 有什么不懂的地方,可以留言,我会尽快答复,如果需源代码,请留下你的Email
地址,ok,今天就到这里,大家晚安!
****
- 前言
- (一)Android常用名令集锦(图文并茂)!
- (二)Android Launcher抽屉类SlidingDrawer的使用!
- (三)Android 中自定义View的应用.
- (四)Android 中自定义属性(attr.xml,TypedArray)的使用!
- (五)Android 中LayoutInflater的使用!
- (六)Android 中MenuInflater的使用(布局定义菜单)!
- (七)Android 中Preferences的使用!
- (八)Android Widget开发案例(世界杯倒计时!)
- (九)Android Handler的使用!!!
- (十)Android PopupWindow的使用!!!
- (十一)Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
- (十二)Android 在一个应用中如何启动另外一个已安装的应用!!!
- (十三)Android 数据库SQLiteDatabase的使用!!
- (十四)Android Location的使用!!
- (十五)通过Location获取Address的使用!
- (十六)Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!
- Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)!
- (十七)Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- (十八)列出Android设备中所有启动的服务,及判断某个服务是否开启!
- (十九)Android开发中,使用线程应该注意的问题!
- (二十)Android与JavaScript方法相互调用!
- (二十一)Android中创建与几种解析xml的方法!
- (二十二)Android中几种图像特效处理的集锦!!
- (二十三)Android中的日历读写操作!!!
- (二十四)Android WebView的缓存!!!
- (二十五)Android 中的AIDL!!!