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;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();}@Overridepublic 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"><Buttonandroid: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;@Overrideprotected 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() {@Overridepublic 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;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);db.execSQL(CREATE_CATEGORY);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();}@Overridepublic 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,用于添加数据

    <Buttonandroid: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() {@Overridepublic 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用于更新数据

    <Buttonandroid: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() {@Overridepublic 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,用于删除表中数据

<Buttonandroid: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() {@Overridepublic 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

1 <Button
2         android:id="@+id/query_data"
3         android:layout_width="match_parent"
4         android:layout_height="wrap_content"
5         android:text="Query Data"/>

修改MainAvtivity中的代码

Button queryData = (Button)findViewById(R.id.query_data);queryData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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();}});

转载于:https://www.cnblogs.com/HarSong13/p/10691031.html

Android基础 (六) 数据存储 Part 3 SQLite数据库存储相关推荐

  1. 数据存储方案(二)-SQLite数据库存储

    创建数据库 SQLiteOpenHelper基本用法 SQLiteOpenHelper 是一个抽象类, 需要创建一个帮助类去继承它.SQLiteOpenHelper 中有两个抽象方法,分别是 onCr ...

  2. Android基础_数据存储

    2019独角兽企业重金招聘Python工程师标准>>> Android基础_数据存储 Android数据存储的几种形式 继承SQLiteOpenHelper public class ...

  3. 【转】Android使用嵌入式关系型SQLite数据库存储数据【学习记录】

    为什么80%的码农都做不了架构师?>>>    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成 ...

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

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

  5. Android基础——JSON数据的全方位解析

    Android基础--JSON数据的全方位解析 本篇文章包括以下内容: JSON是什么 JSONObject的解析和存储 JSONObject的解析和存储(抽象) JSONArray的解析和存储 模拟 ...

  6. Android Studio如何查看自己创建的SQLite数据库

    Android Studio如何查看自己创建的SQLite数据库 在学习安卓开发的时候,有时候需要建立一个SQLite数据库,在创建完之后,想要查看的时候你不知道在哪里找,并且有时候找到了也不知道如何 ...

  7. Android数据存储(三)----- SQLite数据库存储

    SQLite是Android系统内置的数据库,是一种轻量级的关系型数据库,它运算速度快,占用资源少,非常适合在移动设备上使用.同时,它不仅支持标准的SQL语法,还遵循了数据库的ACID事务. 一.创建 ...

  8. android查询mysql并显示_Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解...

    本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录 ...

  9. Android SQLite 数据库存储

    SQLite说明 SQLite是一款轻型的关系型数据库服务器,移动设备的数据库存储都是用SQLite 应用运行需要保存一系列有一定结构的数据,比如:公司员工信息 存储的文件类型:.db 数据保存的路径 ...

  10. 使用SQLite数据库存储数据(1)-操作SQLite数据库

    在使用SQLite API函数如有疑问,可以参考官方函数文档: http://www.sqlite.org/c3ref/funclist.html 操作SQLite数据库 SQLite数据库是文件数据 ...

最新文章

  1. Servlet3.0之九:web模块化
  2. 怎么把PDF格式改成EXCEL
  3. 成长的速度一定要超过父母老去的速度
  4. 读书笔记4数据的读入和保存
  5. winform中openfiledialog过滤压缩文件格式_什么是最佳图像格式?不同的文件格式及其特点...
  6. EDEN-MACE 1.4.0 更新,增加数据清理功能
  7. .net单点登录demo_图文并茂,为你揭开“单点登录“的神秘面纱
  8. Android布局文件怎样转java,android studio中从布局文件到mainactivity.java的控制流
  9. 人机协作机器人发展趋势_人工智能非万能!智能安防机器人下一站:人机协作...
  10. 自动简单,完美解决 vissim4.3 每次启动修改时间问题!
  11. 用友 NC客户化开发手册
  12. 《女士品茶》读书笔记
  13. 华为云学院-人人学loT学习笔记- 第五章 操作系统 轻量开源
  14. 常用的项目团队管理方法
  15. 7939.com,7b.com.cn,9505.com,4199.com 清除工具(转)
  16. Texture tiling
  17. 3年100亿!苏宁易购与倍科达成重磅战略合作
  18. Android运用手机多媒体
  19. iframe(标签的使用)
  20. 软件质量测试大作业示例

热门文章

  1. 微服务架构及其最重要的10个设计模式
  2. 自从上了 SkyWalking,睡觉真香!!来,通过 Excel 来认识神器——POI
  3. 为什么 Eureka 比 ZooKeeper 更适合做注册中心?
  4. 阿里巴巴为什么要禁用Executors创建线程池?
  5. 甲骨文裁员后续:近万招聘者哄抢甲骨文前员工
  6. Anroid性能优化系列——Improving Layout Performance(二)
  7. 2016 Android Top 10 Library
  8. 如何在原有的cookie里面添加值_【平面设计教程】如何创建一个漂亮又好吃的饼干呢?...
  9. 想转行做web前端工程师,必学这6大技能
  10. 电子书分页,翻页效果,字体大小调整和基本功能实现