6.4 SQLite数据库存储

SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少。

6.4.1 创建数据库

Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类,借助这个类可以对数据库进行创建和升级。

SQLiteOpenHelper是一个抽象类,需要创建一个自己的帮助类去继承它。

SQLiteOpenHelper有两个抽象方法,onCreate()和onUpgrade(),分别实现创建、升级数据库的逻辑。

SQLiteOpenHelper的另外两个重要的实例方法:getReadableDatabases()和getWritableDatabases(),这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在在则直接打开,否则则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。当数据库不可写入时(如磁盘已满),getReadableDatabases()方法返回额对象将以只读方式去打开数据库,而getWritable DATabase()方法则出现异常。

a. 新建MyDatabaseHelper类继承SQLiteOpenHelper

SQLiteOpenHelper的构造方法接收四个参数,第一个为Context,第二个为参数为数据库名,第三个为允许在查询数据的时候返回一个自定义的Cursor,一般为null,第四个表示当前数据库的版本号,用于对局库进行升级操作。

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)"; private Context mContext; 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);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

b. 布局中加一个button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"/>
</LinearLayout>

c.在MainActivity中给Button注册事件来创建数据库

构建出SQLiteOpenHelper的实例之后,调用.getWritableDatabase()方法

public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dpHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dpHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dpHelper.getWritableDatabase();
}
}); }

运行程序:

点击按钮就会显示Toast,并创建数据库。

6.4.2 升级数据库

添加一张Category()表

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)";
public static final String CREATE_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;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).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);

}
}

在onUpgrade()方法中执行了两条DROP语句,如果发现数据库中已经存在Book表或Category表了,就将两张表删除掉,然后再调用onCreate()方法重建。

需要先将已经存在的表删除掉,若在创建时发现这张表已经存在了,就会直接报错。

在MainActivity中修改代码

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

将版本号改为比1大的数即可,表明对数据库进行升级了。

在adb shell 中打开BookStore.db 数据库

表明创建了Book和Category

6.4.3 添加数据

对数据进行的操作有4种,CRUD,添加(Create),查询(Retrieve),更新(Update),删除(Delete)

SQL语言中,添加数据 insert,查询数据 select,更新数据 update,删除 delete

SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法都会返回一个SQLiteDatabase对象,借助这个对象进行所有的CRUD操作。

添加操作

SQLiteDatabase提供了一个insert()方法来添加数据,接收三个参数,第一个为表的名字,第二个用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般直接传入null,第三个参数是一个ContentValues对象,提供了一系列的put()方法重载,用于向ContentValues中添加数据,每个列名以及对应的待添加数据传入即可。

a.加一个button,用于添加数据

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

b.修改MainActivity中的代码

   Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//组装第一条数据
values.put("name", "The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.96);
db.insert("Book", null, values);//插入第一条数据
values.clear();
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);
Toast.makeText(MainActivity.this, "Add successfully", Toast.LENGTH_SHORT).show();
}
});

运行程序:

点击按钮两次

6.4.4 更新数据

SQLiteDatabase提供了update()方法,接收4个参数。

第一个为表明,第二个是ContentValues对象,把更新的数据在这里装进去。第三、第四个参数用于约束更新某一行或某几行的数据,不指定的话默认就是更新所有行。

a.添加一个button用于更新数据

    <Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update data"/>

b.修改MainActivity中的代码

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

value.put("price", 10.99) 表示把价格这一列的数据更新成10.99

update的第三个参数对应的是SQL语句的where部分,表明更新所有name等于?的行,而?是一个占位符,通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容,意图即为name为The Dat Vinci Code的价格改为10.99

可以看到The Da Vinci Code价格都更新为10.99

6.4.5 删除数据

SQLiteDatabase中提供了delete()方法,接收三个参数。

第一个为表名,第二、第三个参数用于约束删除每一行或某几行的数据,不指定的话默认删除所有。

a.加一个Button,用于删除表中数据

<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete data"/>

b.修改Mainactivity中的代码

    Button deleteData = (Button)findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
db.delete("Booke", "pages > ?", new String[]{"500"});
Toast.makeText(MainActivity.this, "Delete successfully", Toast.LENGTH_SHORT).show();
}
});

第二、第三个参数意思是从表中删除页数大于500的书

运行程序:

发现大于500页的书都已经从表中消失。

6.4.6 查询数据

SQL = Structured Query Language 结构化查询语言,主要功能体现在“查”上

SQLiteDataBase提供了query()方法用于对数据查询,最短的重载需要传入七个元素

query()方法参数 对应SQL部分 描述
table from table_name 指定查询的表名
columns select column1, column2 指定查询的列名
selection where column = value 指定where的约束条件
selectionArgs - 为where中的占位符提供具体的值
groupBy group by column 指定需要group by的列
having having column = value 对group by后的结果进行进一步约束
orderBy order by column1, comlumn2 指定查询结果的排序方式

在布局中加入Button query data

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

修改MainAvtivity中的代码

Button queryData = (Button)findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dpHelper.getWritableDatabase();
//查询Book表中所有的数据
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("MainActivity", "book name is " + name);
Log.d("MainActivity", "book authur is " + author);
Log.d("MainActivity", "book page is " + pages);
Log.d("MainActivity", "book price is " + price);
}while(cursor.moveToNext());
}
cursor.close();
}
});

<Android基础> (六) 数据存储 Part 3 SQLite数据库存储的更多相关文章

  1. 4、Android-数据存储方案(SQLite数据库存储)

    4.4.SQLite数据库存储 这是Android内置的数据库 是一款轻量级的关系型数据库 运算速度非常快.占用资源少.通常只需要几百kb的内存就够了 因而特别适合在移动端设备上使用 SQLite不仅 ...

  2. <Android基础> (六) 数据存储 Part 1 文件存储方式

    第六章 数据存储 6.1 持久化技术 持久化技术指将内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. 主要有三种方式用于简单地实现数据持久化功能:文件存储.S ...

  3. <Android基础> (六) 数据存储 Part 2 SharedPreferences方式

    6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...

  4. Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储

    前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...

  5. Android中数据存储(三)——SQLite数据库存储数据

    当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...

  6. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  7. 安卓数据存储(3):SQLite数据库存储

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...

  8. 使用嵌入式关系型SQLite数据库存储数据

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...

  9. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

随机推荐

  1. 使用curl制作简易百度搜索

    这几天研究了一下php中的curl类库,做了一个简单的百度搜索,先上代码 <div style="width:200px;height:100px;"> <div ...

  2. Android Monkey压力测试使用

    一.Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击.滑动.Application切换.横竖屏.应用关闭)实现对 ...

  3. PDF转图片工具

    点击下载( 提取码:1ll1 ) 软件功能基于mupdf,UI使用wxpython开发 功能: 支持pdf转图片,图片格式png 支持批量转换 使用: 第一步,点击按钮添加文档到列表,或直接将待转换文 ...

  4. Android Studio项目用Git上传至码云(OSChina)

    工具: Git安装(官网下载,默认安装即可). 步骤一: 新建一个Android Studio项目: 步骤二: 申请OSChina账号.登陆并创建新项目 1. 2. 3.点击复制,下面在Android ...

  5. Log4j配置(xml和property两种)

    本文章为转载记录,纯粹个人备忘. 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一 ...

  6. Docker-Linux环境安装

    不同服务器操作系统安装命令不同,例如centOS默认用yum,Ubuntu可能默认用apt-get.这里推荐一种安装方式,通过下载shell脚本 https://get.docker.com,会检测操 ...

  7. EOS开发入门

    EOS开发入门   在上一篇文章<EOS开发环境搭建>中,我们已经完成了EOS开发环境的搭建,本次为大家带来的是EOS开发入门的相关内容. 1. EOS的合约开发基础   智能合约是一种旨 ...

  8. C#的扩展方法(this)

    先在StringLibrary类中定义一个静态方法,如下: public static class StringLibrary { //第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰 ...

  9. redis数据库的基础

    redis数据库 redis有以下三个特点 redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 redis不仅仅支持简单的key-value类型的数据,同时还提 ...

  10. Jquery消息提示插件toastr使用详解

    toastr是一个基于jQuery简单.漂亮的消息提示插件,使用简单.方便,可以根据设置的超时时间自动消失. 1.使用很简单,首选引入toastr的js.css文件 html <script s ...