Android数据存储之SQLite

概览

l  概述

l  CRUD方法详解

l  注意事项

 

概述

对于大量数据的处理,如果不想将数据存于服务器端,Android API提供了对关系数据库SQLite的支持,在android-SDKtool目录下已经提供了SQLite的应用程序,用于管理数据库中的数据。当android应用使用SQLite进行数据存储的时候,SQLite数据库是以文件的形式存放在SD卡中的。

 

Android API提供了SQLiteDataBaseSQLiteOpenHelp这两个类支持数据的CRUD操作。其中SQLiteOpenHelp对数据库创建、连接管理、版本更新进行了封装。SQLiteDataBase提拱了丰富的增、删、改、查的方法。

 

CRUD方法详解

l  新建数据库

1.        继承SQLiteOpenHelp,重写OnCreate()方法:

 

public class DictionaryOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);";

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}

另外值得注意的是,SQLiteOpenHelp类提供的另一个需要重写的方法OnUpgrade(),用于对。

2.        对于继承的SQLiteOpenHelp之后得到的实例,通过getReadableDatabase()getWritableDatabase()返回一个sqLiteDatabase实例实现对数据库的读与写的相关操作。

SQLiteDataBase  sqLiteDatabase = sqliteOpenHelp. getReadableDatabase ();
SQLiteDataBase  sqLiteDatabase = sqliteOpenHelp.getWritableDatabase();


 

3.        sqLiteDatabase类提供的主要方法:

execSQL(String sql)
Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.

execSQL(String sql, Object[] bindArgs)
Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE.

insert(String table, String nullColumnHack, ContentValues values)
Convenience method for inserting a row into the database.

rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)
Runs the provided SQL and returns a Cursor over the result set.

rawQuery(String sql, String[] selectionArgs)
Runs the provided SQL and returns a Cursor over the result set.


 

l  插入数据

ContentValues cv = new ContentValues();
		cv.put("name",user.getName());
		cv.put("password", user.getPassword());
		sqLiteDatabase.insert("user", null,cv);


 

l  查询数据

查询所有数据:

sqLiteDatabase = dbHelper.getReadableDatabase();
		Cursor cursor = sqLiteDatabase.rawQuery("select * from user;", null);
		while(cursor.moveToNext()){
			user = new User();
			user.setName(cursor.getString(cursor.getColumnIndex("name")));
			user.setPassword(cursor.getString(cursor.getColumnIndex("password")));
			list.add(user);
		}


 

ID查询:

User user = new User();
		String[] selectionArgs = {String.valueOf(id)};
		try {
		sqLiteDatabase = dbHelper.getReadableDatabase();
		Cursor cursor = sqLiteDatabase.rawQuery("select * from user where _ID=?",selectionArgs);
		while(cursor.moveToNext()){
			user.setName(cursor.getString(cursor.getColumnIndex("name")));
			user.setPassword(cursor.getString(cursor.getColumnIndex("password")));
		}


 

l  修改数据

sqLiteDatabase = dbHelper.getWritableDatabase();
			String[] whereArgs = {String.valueOf(user.get_ID())};
			ContentValues cv = new ContentValues();
			cv.put("name", user.getName());
			cv.put("password", user.getPassword());
			sqLiteDatabase = dbHelper.getReadableDatabase();
			sqLiteDatabase.update("user", cv, "_ID=?", whereArgs);


 

l  删除数据

String[] whereArgs = {String.valueOf(id)};
			sqLiteDatabase = dbHelper.getWritableDatabase();
			sqLiteDatabase.delete("user", "_ID=?", whereArgs);


 

l  值得注意的是,execSQL方法也可以实现上述某些功能,不过根据API,该方法说明如下:


public void execSQL(String sql, Object[] bindArgs) 
Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE.


官方的建议是不能用此方法执行SELECT/INSERT/UPDATE/DELETE操作:

For INSERT statements, use any of the following instead. 
•insert(String, String, ContentValues)
•insertOrThrow(String, String, ContentValues)
•insertWithOnConflict(String, String, ContentValues, int)

 For UPDATE statements, use any of the following instead. 
•update(String, ContentValues, String, String[])
•updateWithOnConflict(String, ContentValues, String, String[], int)

 For DELETE statements, use any of the following instead. 
•delete(String, String, String[])

 For example, the following are good candidates for using this method: 
•ALTER TABLE
•CREATE or DROP table / trigger / view / index / virtual table
•REINDEX
•RELEASE
•SAVEPOINT
•PRAGMA that returns no data


实现如下:

 

实现如下:

 

增加数据:

Object[]bindArgs = {user.getName(),user.getPassword()};

sqLiteDatabase.execSQL("insert into uservalues(null,?,?);", bindArgs);

 

修改数据:

Object[]whereArgs = {user.getName(),user.getPassword(),String.valueOf(user.get_ID())};

sqLiteDatabase.execSQL("update user setname=?,password=? where _ID=?", whereArgs);

 

删除数据:

String[]whereArgs = {String.valueOf(id)};

sqLiteDatabase.execSQL("delete from user where _ID =?;", whereArgs);

 

注意事项

l  每次事物处理完成后务必记得关闭数据库

l  SQLite不支持多线程。支持同时打开、读数据库,但是不能同时写。可以通过读写锁来控制多线程的写操作。

 

 

你可能感兴趣的:(Android数据存储之SQLite)