您的位置:首页 > 数据库

数据存储之SQLite与LitePal<一>

2017-04-28 18:56 288 查看
SQLite

一.简意:

(1)SQLite:是一款轻量级关系数据库,占用资源少,运行速度快

(2)适用于大量复杂关系数据(file,sp此时不太适合)

二,用法:

(1)创建一个类 继承SQLiteOpenHelper,重写onCreate()和onUpgrade()方法

onCreate()方法:创建表

onUpgrade():版本更新

如下:

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)";

//创表语句2
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";

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

/**
* 创建表
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext , "Create successed" , Toast.LENGTH_SHORT).show();
}

/**
* 更新数据表
* @param db
* @param oldVersion
* @param newVersion
*/
@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);
}
}

2.在Activity中去测试:增删改查等操作
布局,定义简单的几个按钮:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"/>
<Button
android:id="@+id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add data"/>
<Button
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete data"/>
<Button
android:id="@+id/update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="update data"/>
<Button
android:id="@+id/retrieve"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="retrieve data"/>

</LinearLayout>
在Activity中去执行操作,
四个方法的运用说明在例子中

public class DataBaseActivity extends AppCompatActivity {

//创建数据库
@ViewInject(R.id.create_database)
private Button mBtnCreate;

//增加数据
@ViewInject(R.id.add)
private Button mBtnAdd;

//更新数据
@ViewInject(R.id.update)
private Button mBtnUpdate;

//删除数据
@ViewInject(R.id.delete)
private Button mBtnDelete;

//查询数据
@ViewInject(R.id.retrieve)
private Button mBtnRetrieve;

//MyDatabaseHelper对象
private MyDatabaseHelper dbHelper;
//SQLiteDatabase对象
private SQLiteDatabase db;

private static final String TAG = "DataBaseActivity";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);

ViewUtils.inject(this);

//初始化:4个参数:上下文,数据库名字,CursorFactory对象,版本号;
//当需要更新数据库版本时可以+1
dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null ,1);
db = dbHelper.getWritableDatabase();
}

/**
* 创建数据库表
* @param view
*/
@OnClick(R.id.create_database)
public void CreateDatabase(View view){

//创建或打开一个现有的数据库
//getReadableDatabase():当磁盘空间满时,将以只读方式去打开
//getWritableDatabase():当磁盘已满时,抛出异常
dbHelper.getWritableDatabase();
}

/**
* 增加数据:public long insert(String table, String nullColumnHack, ContentValues values)
* table:表名
* nullColunmHack:用于在未指定添加数据时,给某些空列自动赋值null
* values:ContentValues对象,添加相应数据
* @param view
*/
@OnClick(R.id.add)
public void addDate(View view){

ContentValues values = new ContentValues();
//
values.put("name" , "第一行代码");
values.put("author" , "郭霖");
values.put("pages" , 570);
values.put("price" , 79.00);

db.insert("Book" , null , values);
values.clear();

//
values.put("name" , "编译原理");
values.put("author" ,"MouMou");
values.put("pages" , 500);
values.put("price" , 66.00);
db.insert("Book" , null , values);
}

/**
* 更新数据:4个参数
* 假如突然打折,更新某个商品价格
* public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
* whereClause:约束某些行
* whereArgs:约束某些行的更新数据
* @param view
*/
@OnClick(R.id.update)
public void updateData(View view){

ContentValues values = new ContentValues();
values.put("price" , 58.99);
db.update("Book" , values , "name = ?",new String[]{"编译原理"});

}

/**
* 删除数据:4个参数
* public int delete(String table, String whereClause, String[] whereArgs)
* 与update类似
* @param view
*/
@OnClick(R.id.delete)
public void deleteData(View view){

db.delete("Book" , "price < ?" ,new String[]{"60"});
}

/**
* 查询数据:7个参数
* public Cursor query(String table, String[] columns, String selection,
* String[] selectionArgs, String groupBy, String having,
* String orderBy)
* table--查询的表名,columns--指定要查询的列名(select column1,column2...)
* selection ---- 指定where的约束条件(where column = value)
* selectionArgs---为where中的占位符提供具体值
* groupBy --- 指定需要group by 的列(group by column)
* having -- 对group by后的结果进行约束(having column = value)
* orderBy 指定查询结果的排序方式(order by column1,column2,,,)
* @param view
*/
@OnClick(R.id.retrieve)
public void retrieveData(View view){

Cursor cursor = db.query("Book" , null ,null, null ,null , null ,null);
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));

Log.d(TAG , "book name is " + name);
Log.d(TAG , "book author is " + author);
Log.d(TAG , "book pages is " + pages);
Log.d(TAG , "book price is " + price);

}while (cursor.moveToNext());

}//if
cursor.close();
}
}

现在基本操作就这样了,
记得自己去看SQLiteDatabase和SQLiteOpenHelper的源码略....

LitePal:

这是github上的开源库,稳定性强,操作简单,效率高等等

运用:

(1)在build.gradle(app)添加依赖:

compile 'org.litepal.android:core:1.5.1'(2)在app/src/main下新建一个路径命名:assets,然后在该目录下创建xml文件litepal.xml
内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>

<!--数据库名字.db-->
<dbname value = "BookStore"/>

<!--数据库版本,更新时改动版本-->
<version value = "1"/>

<!--这是自己新建的用于数据库存放表数据类型-->
<list>
<mapping class = "testsdcard.cai.maiyu.mdaima06_01.bean.Book"/>
</list>
</litepal>

无疑是指定数据库名字,版本,还有一个后面你自己创建的数据表类型(可以先不添加)
(3)在manifest中去配置:

在<application   

android:name="org.litepal.LitePalApplication".....
>

......

</application>

若是用自己的application也一样,记得在自己定义的application的onCreate方法中初始化:LitePal 。初始化(this);

(4)创建数据表类:继承DataSupport

public class Book extends DataSupport{
private int id; //id
private String name; //书名
private String author; //作者
private int pages; //页数
private double price; //价格
// private String press; //出版社

// public String getPress() {
// return press;
// }
//
// public void setPress(String press) {
// this.press = press;
// }

public int getId() {
return id;
}

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

public String getName() {
return name;
}

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

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 double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}
}
(5)Activity中使用:
public class TestLitePalActivity extends AppCompatActivity {

//创建数据库
@ViewInject(R.id.create_database)
private Button mBtnCreate;

//增加数据
@ViewInject(R.id.add)
private Button mBtnAdd;

//更新数据
@ViewInject(R.id.update)
private Button mBtnUpdate;

//删除数据
@ViewInject(R.id.delete)
private Button mBtnDelete;

//查询数据
@ViewInject(R.id.retrieve)
private Button mBtnRetrieve;

private static final String TAG = "TestLitePalActivity";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);

ViewUtils.inject(this);

}

//创建数据库
@OnClick(R.id.create_database)
public void createDatabase(View view){

//获取数据库
LitePal.getDatabase();
}

/**
* 添加数据
* @param view
*/
@OnClick(R.id.add)
public void addData(View view){

Book book = new Book();
book.setName("大话数据结构");
book.setAuthor("程杰");
book.setPages(516);
book.setPrice(43.00);
//book.setPress("Unknow");//增加出版社
book.save();
}

/**
* 删除数据
* @param view
*/
@OnClick(R.id.delete)
public void deleteData(View view){

DataSupport.deleteAll(Book.class , "price < ?" , "60");

}

/**
* 更新数据
* @param view
*/
@OnClick(R.id.update)
public void updateData(View view){

Book book = new Book();
book.setPrice(38.50);
book.updateAll("name = ? and author = ?" , "大话数据结构" , "程杰");
//更新数据为默认值
// book.setToDefault("pages");
// book.updateAll();
}

/**
* 查询数据
* @param view
*/
@OnClick(R.id.retrieve)
public void retrieveData(View view){

List<Book> books = DataSupport.findAll(Book.class);
for(Book book : books){
Log.d(TAG , "book name is " + book.getName());
Log.d(TAG , "book author is " + book.getAuthor());
Log.d(TAG , "book pages is " + book.getPages());
Log.d(TAG , "book price is " + book.getPrice());

}

//(2)添加限制:select--选定哪几列
//where--约束条件, order--结果排序 ,limit---结果的数量
//offset---查询结果的便宜了offset(1)代表查询表中的从第2条开始
// List<Book> books = DataSupport.select("name" , "author" ,"pages")
// .where("pages > ?" , "600")
// .order("pages")
// .limit(10)
// .offset(10)
// .find(Book.class);
//(3)用原生数据库语句查询
// Cursor cursor = DataSupport.findBySQL("select * from Book where pages > ?" +
// " and price < ?" ,"700" ,"60");

}
}

从代码中,对比SQLite,发现更简单,更方便,是不是呢?
(1)创建,更新,删除,增加,是不是更方便呢,

(2)而版本更新,只需要在litepal.xml中改版本号

(3)查询,之前要7个参数,现在利用DataSupport.findXXX就可以了

(4)记得创建数据表类要继承DataSupport类

(5)查询还支持多种查询,原生SQL语句查询,

。。。最后去看一下源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: