Sqlite在Android中使用

作者: 小白龙vip | 来源:发表于2016-03-08 23:04 被阅读367次

    准备工作

    我想在我们大学里面也应该学过基本的数据库知识,在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)

    第三方框架

    相关文章

      网友评论

        本文标题:Sqlite在Android中使用

        本文链接:https://www.haomeiwen.com/subject/ylvnkttx.html