Android数据存储之SQLite

66 篇文章 0 订阅

概览
l  概述
l  
CRUD方法详解
l  注意事项
 
概述
对于大量数据的处理,如果不想将数据存于服务器端,Android API提供了对关系数据库SQLite的支持,在android-SDK中tool目录下已经提供了SQLite的应用程序,用于管理数据库中的数据。当android应用使用SQLite进行数据存储的时候,SQLite数据库是以文件的形式存放在SD卡中的。
 
Android API提供了SQLiteDataBase和SQLiteOpenHelp这两个类支持数据的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不支持多线程。支持同时打开、读数据库,但是不能同时写。可以通过读写锁来控制多线程的写操作。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值