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:

Sqlite和Litepal操作数据库比较_第1张图片

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

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

     

配置完之后就可以开始创建数据库了,由于使用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类:


        

最后修改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大的数就可以了。
执行命令:

Sqlite和Litepal操作数据库比较_第2张图片

可以看到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中添加一下:

        

重新运行一下程序:

Sqlite和Litepal操作数据库比较_第3张图片
可以看到Category表已经创建好了,相比较之下litepal则要简单得多。

添加数据

Sqlite

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

 

修改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

任何一个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:

Sqlite和Litepal操作数据库比较_第4张图片

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

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

     

配置完之后就可以开始创建数据库了,由于使用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类:


        

最后修改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大的数就可以了。
执行命令:

Sqlite和Litepal操作数据库比较_第5张图片

可以看到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中添加一下:

        

重新运行一下程序:

Sqlite和Litepal操作数据库比较_第6张图片
可以看到Category表已经创建好了,相比较之下litepal则要简单得多。

添加数据

Sqlite

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

 

修改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的书删除

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的书删除

你可能感兴趣的:(Sqlite和Litepal操作数据库比较)