项目中用到的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", null, null, null, null, null, null);
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烟酒僧
这里有酒,也有故事,有代码,有人生,有眼前的苟且,也有诗和远方
更多推荐阅读:
以上是关于项目中用到的SQLite,你能自己动手实现吗的主要内容,如果未能解决你的问题,请参考以下文章