数据存储之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语句查询,
。。。最后去看一下源码
一.简意:
(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语句查询,
。。。最后去看一下源码
相关文章推荐
- [转载]Ext数据存储与传输<一>
- 安卓学习笔记<一>:数据存储之SharedPreferences
- 【Mysql之自我练习<一>】利用存储过程,造大量测试数据(注:私用的,为了不遗失)
- android数据存储<三>-----Sqlite操作
- 数据存储的5中方式<一>
- Opencv2 学习笔记<一>:cv::Mat数据访问方式
- 数据库优化<一>数据库层和硬件层概述
- 从零开始学android<数据存储(2)Internal Storage内部存储.三十六.>
- 从零开始学android<数据存储(1)SharedPreferences属性文件.三十五.>
- android 数据存储<一>----android短信发送器之文件的读写(手机+SD卡)
- 黑马程序员 Java基础<一> 关键字、常量变量、数据类型
- <Oracle基本的数据存储机制-表>
- asp.net<Web版> ---将excel表数据导入到数据库问题<一>---未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” 提供程序
- C++封装SQLite实例<一>
- &lt;NSCODING&gt;&nbsp;存储数据&amp;n…
- <转>SQLite3 数据类型
- <NSCoding>存储数据 archivedDataWithRootObject unarchiveObjectWithData
- JavaScript导出table数据到Excel<一>
- 数据挖掘十大经典算法 <一> :Adaboost算法
- <NSCoding>存储数据 archivedDataWithRootObject unarchiveObjectWithData