准备工作
我想在我们大学里面也应该学过基本的数据库知识,在Android
里使用的是SqLite
具体介绍。
上面的教程中,有我们基本的使用和操作,不管我们以前会不会写Sql
语句我觉得我们都应该去学一学的,至少基本的增-删-改-查
总得知道吧。这些对于我们以后学习Android
数据库的使用和理解还是挺有帮助的。
Android
使用
SQLiteOpenHelper
创建表,更新表,内部
getWritableDatabase()
和getReadableDatabase()
方法可以获得数据库的SQLiteDatabase
引用。
SQLiteDatabase类
的使用
Android
提供了给我操控数据库封装类,封装了CRUD(添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操),是我们方便简单的来操控我们的数据库;
1.创建表
/**
* Created by Xiao_Bailong on 2016/3/7.
* 数据库的帮助类
*/
public class SQLHelper extends SQLiteOpenHelper {
public String TAG = SQLHelper.class.getSimpleName();
public static final String DB_Name = "chat.db";
public static final String TB_NAME = "CHAT";
public static final String ID = "_id";
public static final String MEETINGID = "meetingid";
public static final String USERID = "userid";
public static final String CONTENT = "content";
public static final String SENDTIME = "sendtime";
public static final String ISREAD = "isread";
/**
* 创建 数据库的Sql语句。需要我们手动编写。
*/
public static final String SQLStr = "CREATE TABLE IF NOT EXISTS " +
TB_NAME + "(" +
ID + " integer primary key," +
MEETINGID + " varchar," +
USERID + " varchar," +
CONTENT + " varchar," +
SENDTIME + " varchar," +
ISREAD + " integer" +
")";
public SQLHelper(Context context, String name, int version) {
super(context, name, null, version);
// SQLiteOpenHelper的构造函数参数:
// context:上下文环境
// name:数据库名字
// factory:游标工厂(可选)
// version:数据库模型版本号
Log.e(TAG, "SQLHelper: " + SQLStr);
}
public SQLHelper(Context context, int version) {
super(context, DB_Name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//类视生命周期一样,在数据库第一次创建的时候被调用,
//即使我们程序重新运行也是一样,在第一次使用的时候才会调用,除非替换数据库名。
db.execSQL(SQLStr);
Log.e(TAG, "onCreate: ");
}
/**
* 在我们需要升级数据库的使用,通过改变版本号,不过我们一般不这么做。
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "DatabaseHelper onUpgrade");
db.execSQL("DROP TABLE IF EXISTS " + TB_NAME);
onCreate(db);
// 上述做法简单来说就是,通过检查常量值来决定如何,升级时删除旧表,然后调用onCreate来创建新表
// 一般在实际项目中是不能这么做的,正确的做法是在更新数据表结构时,还要考虑用户存放于数据库中的数据不丢失
}
/**
*当数据库打开的时候被调用
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
}
}
2.增删改查
这里只做数据库的基本语句记录,具体的Api
的使用请看后面推荐的博文链接;
插入
//获取数据库的操作类
SQLiteDatabase writableDatabase = mSqlHelper.getReadableDatabase();
//执行语句,一个?号,在后面的数组中填值,在再内部对应拼装成为Sql语句
writableDatabase.execSQL("insert into " + SQLHelper.TB_NAME + " values(null , ? , ? , ? , ?,?)", new Object[]{"1234", "ni hao", "nihao ", false, "12345"});
上面对于语句
select into chat values(1234,'ni hao','nihao',false,'12345')
查询
SQLiteDatabase writableDatabase = mSqlHelper.getReadableDatabase();
//执行查询语句
Cursor cursor = writableDatabase.rawQuery("select *from " + SQLHelper.TB_NAME + " where " + SQLHelper.MEETINGID + "=" + "?", new String[]{"12345"});
//获取到查询到数据的游标 Cursor
while (cursor.moveToNext()) {
//这里通过移动游标获取到相应的行,
//找到相应的类获取到对应的值
}
更新 删除 只要修改相应的Sql
语句就好了。
3.提醒
getReadableDatabase
和 getWritableDatabase()
先看源码部分掩码,IDE
Ctrl+方法名
就能看到了
public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}
}
public SQLiteDatabase getReadableDatabase() {
synchronized (this) {
return getDatabaseLocked(false);
}
}
两者的区别在于
getWritableDatabase
取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase
的实例,那么将会发生错误(异常)
getReadableDatabase
取得的实例是先调用getWritableDatabase
以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase
的实例以只读的方式去打开数据库。类似加锁机制。
4.有待完善
个人认为,要把数据库学好,还需要一段时间,一条好的精炼的Sql语句,可以提升程序性能,而且没有更容易查到自己想要的值。
写得不错的博客:[Android 数据库高手秘籍]
(http://blog.csdn.net/sinyu890807/article/category/2522725)
第三方框架
- GreenDao: https://github.com/greenrobot/greenDAO
- LitePal: :https://github.com/LitePalFramework/LitePal
网友评论