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. 第三章 CLR如何解析引用类型

    C#编译器将代码打包成托管模块后,接着会将这些模块合并成程序集,然后统一加载到一个具体的目录,CLR在这个目录查找并且加载所需要的DLL或者exe. 程序集分类:弱命名程序集和强命名程序集,强命名程序 ...

  2. Java 创建、填充PDF表单域

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  3. Git日常须知

    基本操作: git init 初始化环境 git add . 管理文件 git status 查看状态 git diff 文件名 查看修改内容 git commit -m '' 提交文件 git lo ...

  4. JavaScript 运行机制 (Event Loop)

    单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着. 所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步 ...

  5. ArcEngine ILabelEngineLayerProperties Expression 添加常量

    ArcEngine实现复杂标注的时候,需要结合几个字段并将常量加载表达式中. 开始的时候发现VBScript需要采用“”来括起来常量才能在VB中正常使用,但是 ILabelEngineLayerPro ...

  6. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass

    看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签 ...

  8. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  9. 记一次zabbix排错(数据库安装在其它服务器上)

    记一次zabbix排错 故障现象 1.在/var/log/zabbix/zabbix_server.log中出现以下报错: 12106:20190314:090947.010 [Z3001] conn ...

  10. vmware 6 虚拟化 全系列 序列号

    vmware 6 虚拟化 全系列 序列号   vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8C ...