项目中用到的SQLite,你能自己动手实现吗

Posted IT烟酒僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中用到的SQLite,你能自己动手实现吗相关的知识,希望对你有一定的参考价值。

阅读完成需要

5分钟

在日常的android开发过程中,有些项目是直接从服务器获取数据,不需要在本地存储,而有些项目则需要先将数据存储到本地,用时直接从本地获取,如果本地没有,再从服务器获取。

项目中存储数据,一般都会用到数据库,目前网上开源的并且非常好用的数据库也不少,诸如GreenDAO,ORMLite,LitePal,Realm等,在github上也都是有超過2k的star的。

不可否认,这些封装好的数据库非常好用,只需要简单的集成,就可以通过一些api的调用来使用了,至于如何实现数据的存储,如何进行增删改查,这些都已经封装好了,不需要使用者去实现。

无有疑问,这些开源的三方数据库,给我们日常的开发带来了极大的便捷,减少了我们自己去造轮子的烦恼,感谢那些开源的贡献者们,不过,用归用,我们也不能只知其然,不知其所以然。

如果有一天,面试的时候,面试官问你平时项目中用的是什么数据库,你可能会一脸自信的说greendao,接着面试官笑嘻嘻的问到,能说说greendao的底层是怎么实现的吗?这时,提前复习过的你可能也会一脸自信的把greendao的源码讲一遍,然后内心深处得意洋洋的窃喜道,小样,难不住我吧!

此时,面试官脸色一变道,看来你对数据库了解的还可以啊,那能手动去实现一个sqllite数据库吗?这时,你还能再一脸自信的去写出来吗?

当然能!只要你看了这篇文章,你仍然可以一脸自信的去实现一个sqllite数据库。

好了,扯了这么多,就让我们一起去学习如何手动去实现一个sqllite数据库吧!

Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

public class MyDataBaseHelper extends SQLiteOpenHelper {
    private Context mContext;
    public static final String CREATE_BOOK="create table Book ("+"id integer primary key autoincrement,"
    +"author text,"
    +"price real,"
    +"pages integer,"
    +"name text)";

    public MyDataBaseHelper( Context context,  String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

可以看到我创建了一个书本类的表,id属于自增长型的,作者,书名是文本类型,页码是Integer类型,价格是浮点型的。

SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。

下面让我们创建一个DB类,来封装我们的数据库操作。

public class MyDataBaseDB {
    /**
     * 数据库名
     */


    public static final String DB_NAME = "book";

    /**
     * 数据库版本
     */


    public static final int VERSION = 1;

    private static MyDataBaseDB   myDataBaseDB;
    private        SQLiteDatabase db;

    /**
     * 私有化构造方法
     */


    private MyDataBaseDB(Context context{
        MyDataBaseHelper dbHelper = new MyDataBaseHelper(context, DB_NAME, null, VERSION);
        db = dbHelper.getWritableDatabase();
    }

    /**
     * 获取DB的实例
     */

    public synchronized static MyDataBaseDB getInstance(Context context{
        if (myDataBaseDB == null) {
            myDataBaseDB = new MyDataBaseDB(context);
        }

        return myDataBaseDB;
    }


    /**
     * 数据增加
     */


    public void add(Book book{
        if (book != null) {
            ContentValues values = new ContentValues();
            values.put("name", book.getName());
            values.put("author", book.getAuthor());
            values.put("price", book.getPrice());
            values.put("pages", book.getPages());
            db.insert("Book"null, values);
        }
    }

    /**
     * 更新数据
     * 这里只是写个更新价格的操作,具体更新还是要根据项目中的实际情况去自行实现
     */


    public void update(Book book{
        ContentValues values = new ContentValues();
        values.put("price""2.20");
        db.update("Book", values, "name=?"new String[]{book.getName()});
    }

    /**
     * 删除数据
     * 这里也只是写一个删除书的页数大于1000页的书,具体实现根据项目需求
     */


    public void delete(Book book{
        db.delete("Book""pages > ?"new String[]{"1000"});
    }

    /**
     * 查数据
     */


    public List<Book> getBook({
        List<Book> list = new ArrayList<>();
        Cursor cursor = db.query("Book"nullnullnullnullnullnull);
        if (cursor.moveToFirst()) {
            do {
                Book book = new Book();
                book.setId(cursor.getInt(cursor.getColumnIndex("id")));
                book.setName(cursor.getString(cursor.getColumnIndex("name")));
                book.setPrice(cursor.getDouble(cursor.getColumnIndex("price")));
                book.setAuthor(cursor.getString(cursor.getColumnIndex("author")));
                book.setPages(cursor.getInt(cursor.getColumnIndex("pages")));

                list.add(book);
            } while (cursor.moveToNext());
        }
        return list;
    }
}

好了,到这里,SQLite的创建以及增删改查就学习的差不多了,项目中使用时,只需要实例化MydataBaseDB,然后调用就可以了,至于数据库的升级,外联等知识,我们以后再学。

更多精彩内容,请随手关注IT烟酒僧

这里有酒,也有故事,有代码,有人生,有眼前的苟且,也有诗和远方

END


更多推荐阅读:













以上是关于项目中用到的SQLite,你能自己动手实现吗的主要内容,如果未能解决你的问题,请参考以下文章

你能在 Sqlite3(使用 Django)中实现不区分大小写的“唯一”约束吗?

推荐一本正在看的书

node项目中用到的一些模块

推荐一个工作中用到的BI工具

Python小游戏自己动手编写,你能写出几个(分享版)

QT中table view怎么显示sqlite数据库的内容?