Android数据库SQLite的使用示例

openkk 12年前
     Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。文件存储我就不用多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android高手进阶教程(七)之----Android 中Preferences的使用!    <div>     今天我们将讲一下SQLiteDatabase的使用。而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石。为了让大家更好的掌握,我们手把手完成该节的Demo。    </div>    <div>     <br />    </div>    <div>     第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.    </div>    <div>     <img title="a1.jpg" border="0" alt="a1.jpg" src="https://simg.open-open.com/show/ca665c8c01e5bbaca6f0f3ff49e6a295.jpg" width="587" height="728" />     <br />    </div>    <div>     <br />    </div>    <div>     第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:    </div>    <div>     <pre class="brush:java; toolbar: true; auto-links: false;">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);  }  }</pre>     <p></p> 第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:    </div>    <div>     <pre class="brush:xml; toolbar: true; auto-links: false;"><?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> </pre>     <p></p> 第四步:修改SQLiteDatabaseDemo.java代码如下:    </div>    <div>     <pre class="brush:java; toolbar: true; auto-links: false;">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;  }   }  } </pre>     <p></p> 第五步:运行程序效果如下:    </div>    <div>     <img title="a2.jpg" border="0" alt="a2.jpg" src="https://simg.open-open.com/show/f26a5b6ed883accceb57563ff2768e85.jpg" width="383" height="564" />     <br />    </div>    <div>     <img title="a3.jpg" border="0" alt="a3.jpg" src="https://simg.open-open.com/show/9d26924971393664d5ff91c81f497622.jpg" width="387" height="559" />     <br />    </div>    <div>     <img title="a5.jpg" border="0" alt="a5.jpg" src="https://simg.open-open.com/show/ed59aac066eb04b8acd4b0dfabc6797e.jpg" width="384" height="567" />     <br />    </div>    <div>     <img title="a6.jpg" border="0" alt="a6.jpg" src="https://simg.open-open.com/show/53bb476eafcaafdcee7f88ad535372c7.jpg" width="384" height="565" />     <br />    </div>    <div>     <img title="a7.jpg" border="0" alt="a7.jpg" src="https://simg.open-open.com/show/b96e73fafda1f59de02aba67dc63dd05.jpg" width="386" height="569" />    </div>    <div>     <img title="a8.jpg" border="0" alt="a8.jpg" src="https://simg.open-open.com/show/88cd623dc0263ccb7b7b4ebd4500d2c5.jpg" width="383" height="565" />     <br />    </div>    <div>     <div>      <br />     </div>     <div>      第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。     </div>     <div>      另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:     </div>    </div>    <div>     <img style="width:686px;height:337px;" title="a9.jpg" border="0" alt="a9.jpg" src="https://simg.open-open.com/show/2a6b91f63ca7541c5b897cb46b6ca82e.jpg" />     <br />    </div>