前言
最近修改的考务和培训系统将用户收藏的题目和考试错题通过Sqlite存储在手机客户端,趁着这个机会彻底实测了一把.
Android实现数据存储主要有三种方式:文件,SharedPreferences和数据库SqliteDatabase存储.
SQlite是什么? The following specification is defined By Baidu.com
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
Sqlite的操作与其它数据库SqlServer,MySql类似.
**
Step 1.
**
首先,定义自己的类继承Android提供的 SQLiteOpenHelper,需要重写父类提供的两个方法onCreate(),onUpgrade().
myDbHelper:
package com.elvis.tools;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDbHelper extends SQLiteOpenHelper {
private final static String DATABASE_NAME = "BOOKS.db";
private final static int DATABSE_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 MyDbHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABSE_VERSION);
// TODO Auto-generated constructor stub
}
//OnCreate()创建了一张数据表
@Override
public void onCreate(SQLiteDatabase db)
{
// TODO Auto-generated method stub
//String sql = "CRETE TABLE " + TABLE_NAME + " (" +BOOK_ID
// + " INTEGER primary key autoincrement, " + BOOK_NAME + " text, " +
// BOOK_AUTHOR + " text);";
String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID
+ " INTEGER primary key autoincrement, " + BOOK_NAME + " text, "+
BOOK_AUTHOR + " text);";
// db.execSQL(sql);
db.execSQL(sql);
}
//保证table是最新创建的.
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2)
{
// TODO Auto-generated method stub
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
//query
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.getReadableDatabase();
//插入操作必须要用到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;
}
//删除操作 (id代表 要删除的Book_ID)
public void delete(int id)
{
SQLiteDatabase db = this.getReadableDatabase();
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.getReadableDatabase();
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);
}
}
MyDbHelper类定义了数据的增删改查操作.
Step2. MyActivity.java
在menu菜单中添加了三个子菜单,分别为 add, delete和update.分别为这三个子菜单添加了响应事件.注意要实现Menu类的onCreateOptionsMenu(Menu menu)和onOptionsItemSelected(MenuItem item)方法.(这是android面试宝典中的一道题目.)
采用了ListView,并为ListView中的Item添加了响应事件,必须要绑定Adapter.实现了AdapterView.OnItemClickListener()事件.
package com.elvis.sqliteandroid;
import com.elvis.tools.MyDbHelper;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
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 SqlActivity extends Activity implements AdapterView.OnItemClickListener
{
private MyDbHelper 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sql);
initView();
}
public void initView()
{
mBooksDB = new MyDbHelper(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);
}
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() {
// TODO Auto-generated method stub
return mCursor.getCount();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
TextView mTextView = new TextView(mContext);
mCursor.moveToPosition(position);
mTextView.setText(mCursor.getString(1)+ "___" + mCursor.getString(2));
return mTextView;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.sql, 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_UPDATE,0,"UPDATE");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// TODO Auto-generated method stub
super.onOptionsItemSelected(item);
switch(item.getItemId())
{
case MENU_ADD:
add();
break;
case MENU_DELETE:
delete();
break;
case MENU_UPDATE:
update();
break;
}
return true;
}
@SuppressWarnings("deprecation")
public void add()
{
String bookname = BookName.getText().toString();
String bookauthor = BookAuthor.getText().toString();
if(bookname.trim().length() == 0 || bookauthor.trim().length() == 0)
{
return ;
}
mBooksDB.insert(bookname, bookauthor);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Add Success!", Toast.LENGTH_SHORT).show();
}
//onItemSelected的时候,BOOK_ID进行了修改
public void delete()
{
if(BOOK_ID == 0)
{
return;
}
mBooksDB.delete(BOOK_ID);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Delete Success!", Toast.LENGTH_SHORT).show();
}
public void update()
{
String bookname = BookName.getText().toString();
String bookauthor = BookAuthor.getText().toString();
if(bookname.trim().length() == 0 || bookauthor.trim().length() == 0)
{
return ;
}
mBooksDB.update(BOOK_ID, bookname,bookauthor);
mCursor.requery();
BooksList.invalidateViews();
BookName.setText("");
BookAuthor.setText("");
Toast.makeText(this, "Delete Success!", Toast.LENGTH_SHORT).show();
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
// TODO Auto-generated method stub
mCursor.moveToPosition(position);
BOOK_ID = mCursor.getInt(0);
BookName.setText(mCursor.getString(1));
BookAuthor.setText(mCursor.getString(2));
}
}
Step3. 布局文件xx.xml.
<?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>
多动手,多实践,多测验!