Sqlite数据库存储和使用LitePal操作数据库比较

任何一个app,都和数据脱离不了关系,我们使用app时也是一直在和数据打交道,我们看的新闻是数据,我们听的音乐是数据,我们用微信聊天也是在用数据,这篇文章我们来对比一下Android中两种不同的操作数据库的方法,一是直接通过sqlite操作,第二种是通过Litepal进行ORM操作数据库。

创建数据库

Sqlite版

Android中提供了一个SqLiteOpenHelper的类来帮我们实现数据库的操作,我们使用SqLiteHelper的一个非常重要的实例方法:getWritaleDataBase().
首先我们要创建一个class继承自SQLiteOpenHelper,代码如下:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table Book("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";//SQL命令存入到String常量中
    public static final String CREAT_CATEGORY = "create table Category(" +
            "id integer primary key autoincrement," +
            "category_name text," +
            "category_code integer)";//同上
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }//MyDataBaseHelper的构造函数

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);//执行SQL语句
        db.execSQL(CREAT_CATEGORY);
        Toast.makeText(mContext,"Create succeed",Toast.LENGTH_LONG).show();//执行完之后弹出通知
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }


}

然后在xml中创建一个Button(代码略)

最后修改MainActivity的代码:

    dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
    final Button createDatabase = (Button)findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dbHelper.getWritableDatabase();
        }
    });

LitePal版:

LitePal是一款开源的数据库框架,GitHub地址:https://github.com/LitePalFramework/LitePal ,上面有详细的关于其的说明。
使用Litepal首先要在grandle中加入:

    dependencies {
        implementation 'org.litepal.android:core:2.0.0'//最新版本为2。0.0
    }

然后要在app/source/main文件夹下新建一个文件夹:assets来存放LitePal的xml文件,新建litepal.xml:

image.png

dbaname用于指定数据库名,vesion为版本号,list用于指定所有的映射模型

最后还需要在AndroidManifes.xml文件中注册一下:

<application
    android:name="org.litepal.LitePalApplication"
</application>     

配置完之后就可以开始创建数据库了,由于使用ORM模型,所以我们可以采用class的方式描述SQL语言,新建一个Book类:

import org.litepal.crud.DataSupport;
import org.litepal.crud.LitePalSupport;

public class Book extends LitePalSupport{
private int id;
private double price;
private String author;
private int pages;
private String name;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public double getPrice() {
    return price;
}

public void setPrice(double price) {
    this.price = price;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public int getPages() {
    return pages;
}

public void setPages(int pages) {
    this.pages = pages;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

语句很简单,我们定义了id,author,price,pages,name这几个字段,并且生成了对应的getter和setter方法,这个Book类就对应于数据库中的Book表。

接下来需要在litepal.xml文件中添加一下Book类:

<list>
        <mapping class="com.example.a15186.litepaltest.Book" />
</list>

最后修改MainActivity代码即可:

Button createDatabase = (Button)findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LitePal.getDatabase();
        }
    });
image.png
image.png

可以看到Book表已经创建成功了。

升级数据库

Sqlite版

升级数据库我们需要用到OnUpgrade方法,我们的目标是添加一个名为category的table,我们同样把指令赋值给一个常量

public static final String CREAT_CATEGORY = "create table Category(" +
        "id integer primary key autoincrement," +
        "category_name text," +
        "category_code integer)";

然后在Oncreate中添加执行语句:

 db.execSQL(CREAT_CATEGORY);

还没有完,这样是创建不了的,还需要改动一下OnUpgrade的数据:

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("drop table if exists Book");
    db.execSQL("drop table if exists Category");
    onCreate(db);
}

这句语句的意思就是如果Book/Category表存在的话删除他重新创建。
最后还需要修改一下MainActivity来使Upgrade生效:

        dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);

MyDatabaseHelper的最后一个参数为版本号,原来是1,现在只要改成一个比1大的数就可以了。
执行命令:

image.png

可以看到Category表已经创建了。

Litepal版

而在Litepal中升级数据库则简单得多,比如我们同样要添加一个Category表,只需要像创建Book表一样创建一个Category class:

public class Category {
private int id;
private String categoryName;
private int categoryCode;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getCategoryName() {
    return categoryName;
}

public void setCategoryName(String categoryName) {
    this.categoryName = categoryName;
}

public int getCategotyCode() {
    return categoryCode;
}

public void setCategotyCode(int categotyCode) {
    this.categoryCode = categotyCode;
}

}

然后同样在litepal.xml中添加一下:

        <mapping class="com.example.a15186.litepaltest.Category" />

重新运行一下程序:

image.png

可以看到Category表已经创建好了,相比较之下litepal则要简单得多。

添加数据

Sqlite

首先在activity_main.xml中添加一个按钮:

 <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/add_data"
    android:text="Add Data"
    />

修改MainActivity中的代码:

Button addData  = (Button)findViewById(R.id.add_data);
    addData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            ContentValues values = new ContentValues();//实例化一个contentvalues来操作数据
            values.put("name","The Da Vinci Code");//添加name
            values.put("author","Dan Brown");
            values.put("pages",154);
            values.put("price",16.96);
            db.insert("Book",null,values);//把values添加到Book表中
            values.clear();/清楚values存放大数据
            values.put("name","The Lost Symbol");
            values.put("author","Dan Brown");
            values.put("pages",510);
            values.put("price",19.95);
            db.insert("Book",null,values);//插入再次添加到values中的数据
        }

执行操作:

image.png

数据已经被插入

Litepal

使用litepal添加数据首先需要使Book class继承自LitepalSupport:

    public class Book extends LitePalSupport{

然后修改MainActivity:

 Button addData = (Button)findViewById(R.id.add_data);
    addData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Book book = new Book();
            book.setName("The Da Vinci Code");
            book.setAuthor("Dan Brown");
            book.setPages(454);
            book.setPrice(16.96);
            book.setPress("Unkown");
            book.save();
        }

代码非常简单。

更新数据

Sqlite

首先同样加入一个对应的Button,然后修改MainActivity:

   Button updateData = (Button)findViewById(R.id.update_data);
    updateData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("price",10.99);
            db.update("Book",values,"name = ?", new String[]{"The Da Vinci Code"});
        }
    });

db的update有四个参数,第三个参数对应于SQL语句中的where部分,最后一个参数代表第三个参数的问号,总的意思是把Book表中名为"The Da Vinci Code"的书价格改成10.99。

Litepal

首先同样加入一个对应的Button,然后修改MainActivity:

Button updateData = (Button)findViewById(R.id.update_data);
    updateData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Book book = new Book();
            book.setPrice(14.95);
            book.setPress("Anchor");
            book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
        }
    });

实例化一个Book类,然后set数据,最后使用UpdateAll方法把名为 The Lost Symbol"作者为“Dan Brown"的书price和press更改了

删除数据

Sqlite

Button deleteData = (Button)findViewById(R.id.delete_data);
    deleteData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            db.delete("Book","pages>?",new String []{"500"});

        }
    });

代码代表把Book表中pages大于500的书全部删除

Litepal

Button deleteData = (Button)findViewById(R.id.delete_data);
    deleteData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LitePal.deleteAll(Book.class,"price < ?","15");
        }
    });

代码代表把Book表中价格小于15的书删除

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容