4、Android-数据存储方案(SQLite数据库存储)
4.4、SQLite数据库存储
这是Android内置的数据库
是一款轻量级的关系型数据库
运算速度非常快、占用资源少、通常只需要几百kb的内存就够了
因而特别适合在移动端设备上使用
SQLite不仅支持标准的SQL语法
还遵循了ACID事务
有关系型数据库的使用可以很快的使用SQLite
SQLite比一般的数据库要简单的多
甚至不需要设置用户名和密码就可以使用
Android把这个功能强大的数据库镶嵌到系统当中
是得本地的持久化有了质的飞跃
在存储大量复杂的关系型数据时使用
4.4.1、创建数据库
Android专门提供了一个SQLiteOpenHelper帮助类
借助这个类可以非常简单的对数据库进行创建和升级
前要:
SQLiteOpenHelper是一个抽象类
在使用时需要需要继承它
SQLiteOpenHelper有两个抽象方法:
1、onCreate()
2、onUpgrade()
必须在继承类中重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑
SQLiteOpenHelper中还有两个重要的实例方法:
1、getReadableDatebase()
2、getWriteDatabase()
这两个方法都可以创建或打开一个现有的数据库(数据库已存在则直接打开,否则创建一个新的数据库)
并返回一个可对数据库进行读写操作的对象
当数据库不可写入的时候(如磁盘已满),getReadableDatebase()方法返回的对象将以只读的方式打开数据库
getWriteDatabase()方法则将抛异常
SQLiteOpenHellper中有两个构造方法可供重写
一般使用参数少一点的那个构造方法即可
这个构造方法中接受4个参数:
1、Context,中有它才能对数据库进行操作
2、数据库名:创建数据库时使用的就是这里指定的数据库名称
3、允许我们在查询数据时返回一个自定义的的Cursor,一般传入null
4、表示当前数据库的版本号,可用于对数据库的升级操作
构建书SQLiteHelper的实例之后
在调用getReadableDatabase()或getWriterableDatabase()方法就能够创建数据库
数据库的文件会存在/data/data/<package name>/databases/目录下
此时重写onCreate()方法会得到执行,这里通常回去处理一些创建表的逻辑
创建数据表的方法:
public static final String CREATE_BOOK= "create table Book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"name text);";
SQLite的数据类型很简单
interger整形
real浮点型
text文本类型
blob二进制类型
primary key设置为主键
autoincrement表示id自增
新建类:
MyDatabaseHelper 继承SQLiteOpenHelper
public class MyDatabaseHelper extends SQLiteOpenHelper {
//SQL
public static final String CREATE_BOOK= "create table Book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"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_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
first_layout.xml文件中进行设置新的按钮用于相应事件进行创建数据库
<Button
android:id="@+id/create"
android:text="创建数据库"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在MainActivity中进行绑定事件:
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout); myDatabaseHelper=new MyDatabaseHelper(this,"bookstore.db",null,1);
Button button_create = (Button) findViewById(R.id.create);
button_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
});
}
在onCreate()方法中构建了一个MyDatebaseHelper对象
并且通过构造函数的的参数将数据库名指定以及版本号
在点击事件中掉哟给了getWriterableDatabase()方法
当第一次点击时就会检测到但钱应用程序中并没有这个数据库
于是会调用MyDatebaseHelper对象中的onCreate方法进行创建
然后会有提示信息告我们创建成功
再次点击时,此时数据库已存在,所以不hi进行二次创建

但是其中的表是无法使用此方法进行查看的
使用adb shell进行对数据库和表的创建情况进行检测

每个数据库都会有一个xxx.db-journal是为了让数据库能够支持事务产生的临时日志文件
通常这个文件的大小都是0字节
4.4.2、升级数据库
在MyDatabaseHelper类中还有一个onUpgrade()方法是用于对数据库进行升级
在整个数据库管理工作初中有很重要的作用
public class MyDatabaseHelper extends SQLiteOpenHelper {
//SQL
public static final String CREATE_BOOK= "create table Book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"name text);";
public static final String CREATE_CATEGROY= "create table categroy ("
+"id integer primary key autoincrement,"
+"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);
db.execSQL(CREATE_CATEGROY);
Toast.makeText(mcontext,"Create succeeded",Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
此时在onCreate()方法中添加新的创建库的方法
此时在此运行程序,并不会创建新的数据 库,此时的库依然是之前的创建的库
此时的store.db数据库已经存在了
之后不管怎么点击该onCreate()方法都不会执行
消炎药添加的表也不会进行创建
方法:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists categroy");
onCreate(db);
}
在onUPgrade()方法中执行两个drop语句
若数据库中中已经存在则进行杉树
再次调用onCreate()方法进行重建
该方法执行的条件是其此类的构造方法的第四个参数
此时要传入一个比之前大的数就可以使其执行
myDatabaseHelper=new MyDatabaseHelper(this,"store.db",null,);
此时是可以执行成功的!!!
4.4.3、添加数据
CRUD:
Create:添加
Retrieve:查询
Update:更新
Delete:删除
每一种操作对应各自一种SQL命令
调用SQLiteOpenHelper的getReabableDatabase()或者getWriterableDatabase()方法
是可以用于创建或者升级数据库
这两个方法都会返回一个SQLiteDatebase对象借助这个对象进行CRUD操作
SQLiteDatabase中提供了一个insert()方法,用于添加数据
3个参数:
1、表名,向那个表中添加数据
2、用于在未指定添加情况下给某些可为空的咧自动赋值NULL
3、ConteentValues对象,提供了一系列的put()方法重载,用于向ContentValues中添加数据
之后需要将表中的每个列明以及相应的待添加数据传入即可
定义按钮:
<Button
android:id="@+id/add"
android:text="添加数据"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在MianActivity中:
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout); myDatabaseHelper=new MyDatabaseHelper(this,"store.db",null,);
Button button_create = (Button) findViewById(R.id.create);
button_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
}); //插入数据
Button add = (Button) findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("id",);
contentValues.put("author","MrChegns");
contentValues.put("price",143.2);
contentValues.put("name","Android");
sqLiteDatabase.insert("Book",null,contentValues);
}
});
首先过去SQLiteDatabase对象
然后使用ContentValues来对要添加的数据进行封装
使用insert()方法将数据添加到表中
此时点击按钮之后
使用adb shell进行查看:

数据已经添加到Book表中
4.4.4、更新数据
SQLiteDatabase中提供了一个非常好用的update()方法用于数据的更新
接受4个参数:
1、表名即将操作的数据表
2、ContentValues对象,把要更新的数据封装进入
第三第四参数主要用于约束更新某一行或者某几行的数据,不指定就是更新所有行
<Button
android:id="@+id/updata"
android:text="更新数据"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity中:
Button update = (Button) findViewById(R.id.updata);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("author","MrChegn");
values.put("price",14.2);
sqLiteDatabase.update("Book",values,"name=?",new String[]{"Android"}); }
});
第三个参数相当于MySQl中的where部分 ? 是一个占位符
通过第四位参数提供一个字符串数组作为第三个参数中的每个占位符的相应的内容
点击按钮之后:
可以查询到数据已经进行更改

4.4.5、删除数据
SQLiteDatabase中提供了delete方法
专门用于删除数据
接受3个参数:
1、表名第二第三参数用于约束删除某一行或者某几行的数据,不指定就是删除所有行
定义按钮:
<Button
android:id="@+id/delete"
android:text="删除数据"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity中
//删除数据
Button delete = (Button) findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase sqlite = myDatabaseHelper.getWritableDatabase();
sqlite.delete("Book","id=?",new String[]{"1"});
}
});
点击按钮的事件之后:

4.4.6、查询数据
SQLiteDatabase中提供了query()方法用于对数据库进行查询
参数终端,最短的也需要查询7个参数
1、表名
2、指定查询哪几列
3、4、约束查询某一行或者某几行,不指定默认查询所有
5、用于指定需要去group by的列,不指定则不对group by的列进行查询
6、用于对group by之后的数据进行过滤
7、用于指定查询结果的排序方式,不指定使用默认的配许方式

查询按钮:
<Button
android:id="@+id/query"
android:text="查询数据"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity
//查询数据
Button query = (Button) findViewById(R.id.query);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase sql = myDatabaseHelper.getWritableDatabase();
Cursor book = sql.query("Book", null, null, null, null, null, null);
if (book.moveToFirst()){
do {
String name= book.getString(book.getColumnIndex("name"));
String price= book.getString(book.getColumnIndex("price"));
Log.d("name", name);
Log.d("price", price);
}while (book.moveToNext());
}
book.close();
}
});
点击事件出发后:

查询之后会返回一个Cursor对象
可以使用moveToFirst()方法将指针移动到第一个位置
使用getColumnIndex()方法可以获取到某一列在表中的索引位置
然后找到这个索引传入到相应的取值方法中
就可以从数据库中读取数据
book.close();最后关闭Cursor
4.4.7、使用SQL操作数据库
对于SQL的使用非常好的可以使用SQL来操作数据库
实例:

4、Android-数据存储方案(SQLite数据库存储)的更多相关文章
- android开发之使用SQLite数据库存储
http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...
- Android 数据存储之 SQLite数据库存储
----------------------------------------SQLite数据库---------------------------------------------- SQLi ...
- Android数据读取之Sqlite数据库操作
咱们书接上文,继续来说说Android数据读取,这回,我们要讲的是Sqlite数据库的相关操作.以一个实例开始吧: 首先,上图,看看做成后的效果: 大概描述:类似于浏览器的收藏夹,网站名称,网站地址, ...
- Android中数据存储(三)——SQLite数据库存储数据
当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...
- <Android基础> (六) 数据存储 Part 3 SQLite数据库存储
6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...
- Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储
前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...
- Android数据存储之SQLite数据库
Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...
- Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...
- 使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...
随机推荐
- angular2 *ngIf与[hidden]对比<转>
在AngularJS 1中,如果想切换DOM元素的显示状态,估计你会用AngularJS 1内置的指令如:ng-show 或者 ng-hide: AngularJS 1示例: <div ng-s ...
- 理解ResourceBundle.getBundle("dataSourceFactory")
最近在项目文件中看到这样的代码一下子还看不懂 经过他人指点和自己百度,总算明白大致用处. 首先这个方法时java.util的内置方法,主要功能是用于解析properties文件的. ResourceB ...
- eclipse中实现文本换行
Eclipse 使用系统内置的“ Text Editor ”做为文本编辑器,这个文本编辑器有一个问题,就是文本无法换行. 扩展插件 WordWrap 可以实现文本换行 安装方法: ...
- C/C++:判断机器是32位还是64位
要求是不使用sizeof,一开始写了个看似可以,但是有问题的方法: long* a = NULL; ; int n = (char*)b - (char*)a; 这个方法等价于sizeof(long) ...
- Oracle数据库RowId
RowId是什么? RowId是根据每一行数据的物理信息地址编码而成的一个位列,利用RowId可以快速定位到某一行. Oracle数据库编辑数据必须查出RowId,可以根据如下语句查询: select ...
- 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)
本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...
- BZOJ P1212 [HNOI2004] L语言
标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的集合. 我 ...
- Android Editable
在android的sdk中有讲,“This is the interface for text whose content and markup can be changed (as opposed ...
- android头像上传(获取头像加剪切)
因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下. demo我是类似仿微信的,在一个GridView中展示所有的图片,其中第一个item可以去照相:获取到图片后再进行剪切. 图片的剪切是 ...
- VMware下Linux配置局域网和外网访问(CentOS)
要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...