1.Android中通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备,提供的是一种高效的数据库引擎。
Android中操作数据库首先要通过一个 类:android.database.sqlite.SQLiteOpenHelper。它封装了如何打开一个数据库,其中当然也包含如果数据库不存在 就创建这样的逻辑。看一个例子:
pubilc class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "com.roiding.simple.note"; private static final int DATABASE_VERSION = 1; private static final String NOTES_TABLE_NAME = "notes"; DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " (id integer primary key autoincrement, name text);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS notes"); onCreate(db); } }
这里面,如下的语句需要解释:
在Android中,数据库存放在 /data/data/PACKAGE_NAME/databases 目录下。
接下来就可以使用这个Helper来操作数据库了,操作数据库也就无非是增、删、改、查。先看一个增的例子:
public static void insert(Context context, String s) { DatabaseHelper mOpenHelper = new DatabaseHelper(context); String table = "notes"; String nullColumnHack = "id"; ContentValues values = new ContentValues(); values.put("name", "www.roiding.com"); long id = mOpenHelper.getReadableDatabase().insert(table, nullColumnHack, values); mOpenHelper.getReadableDatabase().close(); }
再看一个查的例子:
public static void select(Context context) { DatabaseHelper mOpenHelper = new DatabaseHelper(context); String table = "notes"; String[] columns = new String[] { "id", "name" }; String selection = "id>? and name<>?"; String[] selectionArgs = new String[] { "0", "roiding.com" }; String groupBy = null; String having = null; String orderBy = "id desc"; String limit = "1"; Cursor c = mOpenHelper.getReadableDatabase().query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit); c.moveToFirst(); for (int i = 0; i < c.getCount(); i++) { String s = c.getString(1); c.moveToNext(); } c.close(); mOpenHelper.getReadableDatabase().close(); }
再看一个删除和修改的例子:
public static void delete(Context context) { DatabaseHelper mOpenHelper = new DatabaseHelper(context); String table = "notes"; String selection = "id>? and name<>?"; String[] selectionArgs = new String[] { "0", "roiding.com" }; String whereClause = selection; String[] whereArgs = selectionArgs; mOpenHelper.getWritableDatabase().delete(table, whereClause, whereArgs); mOpenHelper.getWritableDatabase().close(); }
有了上面的基础这里就容易理解了,这里的whereClause相当于前面的selection,whereArgs相当于前面的selectionArgs。
public static void update(Context context) { DatabaseHelper mOpenHelper = new DatabaseHelper(context); String table = "notes"; String selection = "id>? and name<>?"; String[] selectionArgs = new String[] { "0", "roiding.com" }; String whereClause = selection; String[] whereArgs = selectionArgs; ContentValues values = new ContentValues(); values.put("name", "www.roiding.com"); mOpenHelper.getWritableDatabase().update(table, values, whereClause, whereArgs); mOpenHelper.getWritableDatabase().close(); }
这个update的用法,综合select和delete就可以理解。
注意:
在真实的应用中,会对上面这些基本操作做更高一级的抽象和封装,使之更容易使用。在select时,除了用上述的方法,将分段的SQL语句传进去之外,Android还支持一种方法:使用SQLiteQueryBuilder。如果使用的是上述的分段SQL语句的方法,在Android的内部实现中,也是先将分段的SQL使用SQLiteQueryBuilder的静态方法来生成一个真正的SQL的,而且,我没有看出来使用SQLiteQueryBuilder的优势。
/Chapter09_Data_03/src/com/amaker/test/MainActivity.java
package com.amaker.test;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
SQLiteDatabase db = createDatabase();
// createTable(db);
// insert(db);
// insert2(db);
// update(db);
// update2(db);
// delete(db);
delete2(db);
query(db);
db.close();
}
// 创建数据库,注意这里要指定全路径
private SQLiteDatabase createDatabase(){
return SQLiteDatabase.openOrCreateDatabase( " /data/data/com.amaker.test/databases/temp2.db " , null );
}
// 创建表
private void createTable(SQLiteDatabase db){
String sql = " create table UserTbl(_id integer primary key autoincrement,username text,password text) " ;
db.execSQL(sql);
}
// 插入数据
private void insert(SQLiteDatabase db){
String sql = " insert into UserTbl(username,password) values('amaker','123') " ;
db.execSQL(sql);
}
// 插入2
private void insert2(SQLiteDatabase db){
ContentValues cv = new ContentValues();
cv.put( " username " , " ghz " );
cv.put( " password " , " 456 " );
db.insert( " UserTbl " , null , cv);
}
// 查询
private void query(SQLiteDatabase db){
Cursor c = db.query( " UserTbl " , null , null , null , null , null , null );
if (c.moveToFirst()){
for ( int i = 0 ; i < c.getCount(); i ++ ) {
c.move(i);
int id = c.getInt( 0 );
String username = c.getString( 1 );
String password = c.getString( 2 );
System.out.println(id + " : " + username + " : " + password);
}
}
}
// 修改
private void update(SQLiteDatabase db){
String sql = " update UserTbl set password=888 where _id=1 " ;
db.execSQL(sql);
}
// 修改2
private void update2(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put( " password " , " 999 " );
String whereClause = " _id=? " ;
String[] whereArgs = {String.valueOf( 1 )};
db.update( " UserTbl " , values, whereClause, whereArgs);
}
// 删除
private void delete(SQLiteDatabase db){
String sql = " delete from UserTbl where _id=2 " ;
db.execSQL(sql);
}
// 删除2
private void delete2(SQLiteDatabase db){
String whereClause = " _id=? " ;
String[] whereArgs = {String.valueOf( 1 )};
db.delete( " UserTbl " , whereClause, whereArgs);
}
}
/Chapter09_Data_03/res/layout/main.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"
>
< TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/hello"
/>
</ LinearLayout >
/Chapter09_Data_03/AndroidManifest.xml
<? xml version="1.0" encoding="utf-8" ?>
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package ="com.amaker.test"
android:versionCode ="1"
android:versionName ="1.0" >
< application android:icon ="@drawable/icon" android:label ="@string/app_name" >
< activity android:name =".MainActivity"
android:label ="@string/app_name" >
< intent-filter >
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
</ application >
< uses-sdk android:minSdkVersion ="3" />
</ manifest >