大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Sqlite在Android中使用

准备工作

我想在我们大学里面也应该学过基本的数据库知识,在Android里使用的是SqLite具体介绍。

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.提醒

getReadableDatabasegetWritableDatabase()
先看源码部分掩码,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)

第三方框架