android 数据存储之SQLite
使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,
1、SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
2、SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
3、但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。
4、另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
1.创建Android工程
Project name: db
BuildTarget:Android2.2
Application name: 数据库应用
Package name: com.jbridge.db
Create Activity: DBActivity
Min SDK Version:8、
2. Person实体
package com.jbridge.domain;import android.R.string;public class Person {private Integer id;private String name;private Short age;public Person(String name, Short age) {this.name = name;this.age = age;}public Person(Integer id, String name, Short age) {super();this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}
3.编写DataBaseOpenHelper类
DataBaseOpenHelper继承自SQLiteOpenHelper类。我们需要创建数据表,必须重写onCreate(更新时重写onUpgrade方法)方法,在这个方法中创建数据表。
package com.jbridge.service;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;public class DataBaseOpenHelper extends SQLiteOpenHelper {// 类没有实例化,是不能用作父类构造器的参数,必须声明为静态private static String dbname = "zyj";private static int version = 1;public DataBaseOpenHelper(Context context) {// 第一个参数是应用的上下文// 第二个参数是应用的数据库名字// 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类// 第四个参数是数据库版本,必须是大于0的int(即非负数)super(context, dbname, null, version);// TODO Auto-generated constructor stub}public DataBaseOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");}// onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。// 一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失,从版本几更新到版本几。@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {db.execSQL("DROP TABLE IF EXISTS person");onCreate(db);}}
4.编写PersonService类
PersonService类主要实现对业务逻辑和数据库的操作
package com.jbridge.service;import java.util.ArrayList;
import java.util.Currency;
import java.util.List;import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import com.jbridge.domain.Person;public class PersonService {private DataBaseOpenHelper dbOpenHelper;// private Context context;public PersonService(Context context) {// this.context = context;dbOpenHelper = new DataBaseOpenHelper(context);}public void save(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.beginTransaction();database.execSQL("insert into person(name,age)values(?,?)",new Object[] { person.getName(), person.getAge() });// database.close();可以不关闭数据库,他里面会缓存一个数据库对象,如果以后还要用就直接用这个缓存的数据库对象。但通过// context.openOrCreateDatabase(arg0, arg1, arg2)打开的数据库必须得关闭database.setTransactionSuccessful();database.endTransaction();}public void update(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.execSQL("update person set name=?,age=? where personid=?",new Object[] { person.getName(), person.getAge(),person.getId() });}public Person find(Integer id) {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select * from person where personid=?",new String[] { String.valueOf(id) });if (cursor.moveToNext()) {return new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2));}return null;}public void delete(Integer... ids) {if (ids.length > 0) {StringBuffer sb = new StringBuffer();for (Integer id : ids) {sb.append('?').append(',');}sb.deleteCharAt(sb.length() - 1);SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.execSQL("delete from person where personid in(" + sb.toString()+ ")", ids);}}public List<Person> getScrollData(int startResult, int maxResult) {List<Person> persons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select * from person limit ?,?",new String[] { String.valueOf(startResult),String.valueOf(maxResult) });while (cursor.moveToNext()) {persons.add(new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2)));}return persons;}// 获取分页数据,提供给SimpleCursorAdapter使用。public Cursor getRawScrollData(int startResult, int maxResult) {List<Person> persons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();return database.rawQuery("select personid as _id ,name,age from person limit ?,?",new String[] { String.valueOf(startResult),String.valueOf(maxResult) });}public long getCount() {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.rawQuery("select count(*) from person", null);if (cursor.moveToNext()) {return cursor.getLong(0);}return 0;}}
下面是使用 insert()、delete()、update()和query()方法实现的业务类
package com.jbridge.service;import java.util.ArrayList;
import java.util.Currency;
import java.util.List;import android.R.string;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import com.jbridge.domain.Person;public class OtherPersonService {private DataBaseOpenHelper dbOpenHelper;// private Context context;public OtherPersonService(Context context) {// this.context = context;dbOpenHelper = new DataBaseOpenHelper(context);}public void save(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("name", person.getName());contentValues.put("age", person.getAge());database.insert("person", null, contentValues);}public void update(Person person) {SQLiteDatabase database = dbOpenHelper.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("name", person.getName());contentValues.put("age", person.getAge());database.update("person", null, "personid=?",new String[] { String.valueOf(person.getId()) });}public Person find(Integer id) {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "personid","name", "age" }, "personid=?",new String[] { String.valueOf(id) }, null, null, null);if (cursor.moveToNext()) {return new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2));}return null;}public void delete(Integer... ids) {if (ids.length > 0) {StringBuffer sb = new StringBuffer();String[] strIds = new String[ids.length];// for (Integer id : ids) {// sb.append('?').append(',');// }for (int i = 0; i < strIds.length; i++) {sb.append('?').append(',');strIds[i] = String.valueOf(ids[i]);}sb.deleteCharAt(sb.length() - 1);SQLiteDatabase database = dbOpenHelper.getWritableDatabase();database.delete("person", "personid in(" + sb.toString() + ")",strIds);}}public List<Person> getScrollData(int startResult, int maxResult) {List<Person> persons = new ArrayList<Person>();SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "personid","name", "age" }, null, null, null, null, "personid desc",startResult + "," + maxResult);while (cursor.moveToNext()) {persons.add(new Person(cursor.getInt(0), cursor.getString(1),cursor.getShort(2)));}return persons;}public long getCount() {SQLiteDatabase database = dbOpenHelper.getReadableDatabase();Cursor cursor = database.query("person", new String[] { "count(*)" },null, null, null, null, null);if (cursor.moveToNext()) {return cursor.getLong(0);}return 0;}}
5.编写测试类
编写一个针对PersonService的测试类,测试PersonService类中的各个方法是否正确
package com.jbridge.db;import java.util.List;import com.jbridge.domain.Person;
import com.jbridge.service.OtherPersonService;
import com.jbridge.service.PersonService;import android.test.AndroidTestCase;
import android.util.Log;public class PersonServiceTest extends AndroidTestCase {private static String TAG = "PersonServiceTest";// OtherPersonService personService = new// OtherPersonService(this.getContext());// //不可以这么写,因为Android把context环境变量是在PersonServiceTest实例化后给他的public void testSave() throws Exception {PersonService personService = new PersonService(this.getContext());// personService.save(new Person("老猪", (short) 11));for (int i = 0; i < 10; i++) {personService.save(new Person("你" + i, (short) (i + 10)));}}public void testFind() throws Exception {PersonService personService = new PersonService(this.getContext());Person person = personService.find(1);Log.i(TAG, person.toString());}public void testUpdate() throws Exception {PersonService personService = new PersonService(this.getContext());Person person = personService.find(1);person.setName("lv");personService.update(person);}public void testDelete() throws Exception {PersonService personService = new PersonService(this.getContext());personService.delete(1, 2, 3);}public void testGetCount() throws Exception {PersonService personService = new PersonService(this.getContext());Log.i(TAG, String.valueOf(personService.getCount()));}public void testGetScrollData() throws Exception {PersonService personService = new PersonService(this.getContext());List<Person> persons = personService.getScrollData(0, 3);for (Person person : persons) {Log.i(TAG, person.toString());}}
}
转载于:https://www.cnblogs.com/sunfb/p/3956058.html
android 数据存储之SQLite相关推荐
- Android数据存储之SQLite的操作
Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...
- Android数据存储之SQLite
概览 l 概述 l CRUD方法详解 l 注意事项 概述 对于大量数据的处理,如果不想将数据存于服务器端,Android API提供了对关系数据库SQLite的支持,在android-SD ...
- Android 数据存储之SQLite数据库
转载请标明出处: http://blog.csdn.net/airsaid/article/details/52419418 本文出自:周游的博客 前言 SQLiteDatabase 创建数据库和表 ...
- 安卓 sqlite数据存入mysql_详解Android数据存储—使用SQLite数据库
SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库.Android提供了3种操作数据的方式,SharedPreference(共享首选项).文件存储以及SQLite数据库. ...
- Android数据存储之SQLite数据库存储
Android中每一个数据库对创建它的应用程序包套件来说都是私有的,默认情况下其他应用程序无法直接访问此私有数据库.所有的数据库文件存放在手机中的/data/data/package_name/dat ...
- Android数据存储之GreenDao 3.0 详解
前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...
- 2010-02-28 传智播客—Android(三)数据存储之三SQLite嵌入式数据库
2010-02-28 传智播客-Android(三)数据存储之三SQLite嵌入式数据库 前两篇日志我已经总结了本地数据存储的前两种:文件和配置项.还剩下最后一种数据库存储--SQLite. 一.SQ ...
- 数据存储之 SQLite 数据库操作(三)
上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...
- 数据存储之 SQLite 数据库操作(二)
上一讲我们讲解了SQLite数据库的创建[数据存储之 SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学 ...
- Android数据存储:Shared Preferences
Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式: ...
最新文章
- Java 25 岁,发展现状大曝光!程序员的机会来了
- HDU - 1907 John(尼姆博弈变形)
- JUC锁-CyclicBarrier(七)
- 使用bash echo 输出回车转义
- vue和php网站下载,vue.js去哪下载
- 脑电时频分析II:时频分析
- cad相对坐标快捷键_CAD常用的快捷键
- 王家林 大数据Spark超经典视频链接全集[转]
- 理解Mach-O文件格式(1)
- CryEngine3 调试Shader方法
- 环信移动客服客服昵称头像设置
- 关于航空障碍灯的介绍
- Android 常用图片框架对比
- php path separator,php_DIRECTORY_SEPARATOR 和 PATH_SEPARATOR
- jsp22216美食菜谱食谱网站系统mysql
- XP局域网内共享不了文件
- 【听】百年孤独,拉丁美洲悲剧奋斗史
- 业界 | 涂子沛:从幼稚到成熟,我们这个时代的数据革命
- 1992-2022年31省GDP、第一产业增加值、第二产业增加值 第三产业增加值
- 【图像识别】基于matlab实现步态周期检测与步态角度特征
热门文章
- wps office 2019中文版
- NXP S32K3 RTD-MCAL快速引导
- SAS安装后无法使用增强型编辑器问题解决方法
- postman|接口测试 | pre-request script 场景应用
- 物联网控制的智能LED灯带(1):WS2812灯带控制(WS2812/2811,ESP32,NODE-RED)
- ispe对计算机系统分类,ISPE制药工程指南-调试和确认(CQ)之系统分类
- 如何让自己的CS水平更进一步?(二)了解武器
- 简单易懂的PyTorch版VGG19复现代码
- ar电力远程巡检可视化系统强化员工现场作业能力
- POM文件详解(如何组织POM文件)