日期:2014-05-16  浏览次数:20367 次

android 数据库处理及操作

对于移动客户端来说,数据库肯定都是轻量级的,像sqlite ,今天做一个android下数据库操作的demo。

对于有数据库的应用,如果数据库包含在apk中,不进行处理的话,可能出现一种情况,随着数据记录的增加,应用会越来越大也就是说应用的大小是变化的。解决这个问题的方法是将数据库文件放到sd卡中。

1.在res目录下新建raw目录,将书库文件放到raw目录下

2.应用第一次使用时,将数据库文件写道sd卡中

(别忘了加

<!-- 操作sd卡权限 -->
?<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

)

下面是代码片段:

public SQLiteDatabase openDatabase()
?{
??SQLiteDatabase database = null;
??//得到 sdk状态
??String sdState = android.os.Environment.getExternalStorageState();
??//表示sd卡已经挂载,并且拥有读写权限
??if(sdState.equals(android.os.Environment.MEDIA_MOUNTED))???
??{
???boolean b = false;
???File dir =? new File(PATH);
???//判断是否存在该目录 ,没有则创建
???if(!dir.exists())???
????b =? dir.mkdir();
???
???//sd卡上不存在db文件则将apk中的db资源文件(raw文件下的db文件)保存在sd卡指定的目录下
???String dbpath = PATH +"/"+DBNAME;
???if(b&&!new File(dbpath).exists())
???{
//????//得到输入流
????InputStream inputStream = activity.getResources().openRawResource(R.raw.testdb);
????//创建输出流
????try {
?????FileOutputStream fileOutputStream = new FileOutputStream(dbpath);
?????//将db文件写到sd卡
?????byte[] bs = new byte[8192];
?????int count = 0;
?????while(((count=inputStream.read(bs)))>0)
?????{
??????fileOutputStream.write(bs,0,count);??????
?????}
?????//关闭流
?????inputStream.close();
?????fileOutputStream.close();
?????
????} catch (FileNotFoundException e) {
?????// TODO Auto-generated catch block
?????e.printStackTrace();
????} catch (IOException e) {
?????// TODO Auto-generated catch block
?????e.printStackTrace();
????}
????
???}
???//得到SqliteDatabase 对象
???database = SQLiteDatabase.openOrCreateDatabase(dbpath, null);
???
??}
??return database;
?}

得到了SqliteDatabase对象之后,增删改查 就是小菜一碟了

SqliteDatabase对象对于增,删,改有一个万能的execSQL()方法,也就是说增,删,改都可以用它

除此之外android还提供了非常方便的增删改查方法

查:

Cursor query(TABLE_NAME, null, null, null, null, null, null) ;

Cursor??rawQuery(sql, selectionArgs)

(有很多重载根据自己需求选择)

eg:

public List<TestTable> selectAll() {
??List<TestTable> list = null;
??String sqlStr = "select id,name,sex from tb_test";
??Cursor cursor = database.rawQuery(sqlStr, null);
??if (cursor.getCount() > 0) {
???list = new ArrayList<TestTable>();
???while (cursor.moveToNext()) {
????TestTable table = new TestTable();
????table.setId(cursor.getInt(cursor.getColumnIndex("id")));
????table.setName(cursor.getString(cursor.getColumnIndex("name")));
????table.setSex(cursor.getString(cursor.getColumnIndex("sex")));
????list.add(table);
???}
??}
??return list;
?}

增:

???long insert(tableName, nullColumnHack, values)

eg:

?public long insert(TestTable testTable) {
??ContentValues values = new ContentValues();
??values.put("name", testTable.getName());
??values.put("sex", testTable.getSex());
??return database.insert("tb_test", null, values);
?}

改:

long database.update(tableName, values, whereClause, whereArgs)

eg:

?public long update(TestTable testTable) {
??ContentValues values = new ContentValues();
??values.put("name", testTable.getName());
??values.put("sex", testTable.getSex());
??return database.update("tb_test", values, "id=?",
????new String[] { String.valueOf(testTable.getId()) });
??
?}
删:

long delete(tableName, whereClause, whereArgs)

eg:

?public long delete(int id) {
??return database.delete("tb_test", "id=?",
????new String[] { String.valueOf(id) });
??
?}