Android笔记——Android中数据的存储方式(三)
Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它。SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存取,现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,并且它是以手机内存为储存的。
那么,实际开发项目中有大量数据需要读写,并且需要面临大量用户的并发储存的情况呢。就不应该把数据存放在手机等移动设备的SQLite数据库里,移动设备的储存能力和计算能力都不足以让它充当服务器的角色。虽然SQLite支持大部分SQL-92语法,也可以使用SQL语句,和其他的主要 SQL 数据库没什么区别。但SQLite并不像Oracle、MySQL数据库那样需要安装、启动服务器进程,SQLite数据库只是一个文件。
综上所述,我们可以总结出SQLite数据库的特点:
面向资源有限的设备;
没有服务器进程;
所有数据存放在同一文件中,可自由复制;
跨平台;
操作方便,使用标准的CRUDE语句,ContentResolver.query(), update(), delete() insert()。
还有其他的特点:效率出众,这是无可否认的; 十分适合存储结构化数据 ;方便在不同的Activity,甚至不同的应用之间传递数据。
1.3 例子
4. SQLite数据库:
3.1 案例:创建SQLite数据库
创建数据库需要使用的api:SQLiteOpenHelper
必须定义一个构造方法:
//arg2:数据库文件的名字
//arg3:游标工厂
//arg4:数据库版本
public MyOpenHelper(Context context, String name, CursorFactory factory, int version){}
- 数据库被创建时会调用:onCreate方法
- 数据库升级时会调用:onUpgrade方法
- 创建数据库步骤:
//创建OpenHelper对象
MyOpenHelper oh = new MyOpenHelper(getContext(), "person.db", null, 1);
//获得数据库对象,如果数据库不存在,先创建数据库,后获得,如果存在,则直接获得
SQLiteDatabase db = oh.getWritableDatabase();
- getWritableDatabase():打开可读写的数据库
- getReadableDatabase():在磁盘空间不足时打开只读数据库,否则打开可读写数据库
在创建数据库时创建表
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table person (_id integer primary key autoincrement, name char(10), phone char(20), money integer(20))");
}
- 代码:
- 创建MyOpenHelper类继承 SQLiteOpenHelper
package com.bokeyuan.createsqlite; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
//name:数据库文件的名字
//factory:游标工厂
//version:数据库的版本号
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} //数据库创建时,此方法调用
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
System.out.println("数据库被创建了");
//创建表
db.execSQL("create table person(_id integer primary key autoincrement, name char(10), phone char(20), money integer(10))");
} //数据库升级时,此方法调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
System.out.println("数据库升级了");
} }
- 这里不再用前台视图布局,直接用单元测试框架。
在com.bokeyuan.createsqlite.domian包中创建Test.java 并继承 AndroidTestCase类。
package com.bokeyuan.createsqlite.domian; import com.bokeyuan.createsqlite.MyOpenHelper; import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase; public class Test extends AndroidTestCase { public void Test() {
// 创建数据库
//1.创建OpenHelper对象
//获取一个虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 2);
//2.创建数据库
//如果数据库不存在,那么先创建,再打开,如果数据库已经存在,侧直接打开
SQLiteDatabase db = oh.getWritableDatabase();
//如果磁盘不足,数据库只读
// SQLiteDatabase db = oh.getReadableDatabase();
}
}
- 在清单文件AndroidManifest.xml设置指令集和库:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.bokeyuan.createsqlite"></instrumentation>
<uses-library android:name="android.test.runner"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bokeyuan.createsqlite"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" /> <instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.bokeyuan.createsqlite"></instrumentation>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
数据库存储在 data/< 项目文件夹 >/databases/ 下。我们可以用SQLite Professional打开。
数据库创建时,此方法调用 说明onCreate()方法被调用了,数据库被创建了
把version改成2,Run As →Android JUint Test后, 调用onUpgrade()方法,数据库升级了
//1.创建OpenHelper对象
//获取一个虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 2);
参考资料
Android笔记——Android中数据的存储方式(三)的更多相关文章
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记——Android中数据的存储方式(一)
Android中数据的存储方式 对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用. 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其 ...
- Matlab中数据的存储方式
简介 MATLAB提供了丰富的算法以及一个易于操作的语言,给算法研发工作者提供了很多便利.然而MATLAB在执行某些任务的时候,执行效率偏低,测试较大任务量时可能会引起较长时间的等待.未解决这个问题, ...
- Android的数据的存储方式
数据的存储方式,总的来说分为三种: ① 文件存储: * SharedPreferences存储 * SD卡存储 ---- Environment * 数据库存储 ---- SQLite .MySQL. ...
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- 讨论两种Redis中Token的存储方式
摘要:本文讨论一个问题:存储token时,token与对应用户id谁来作为key? 问题起源问题起源于要给公司的后台管理系统添加权限管理,选用的是开源框架shiro,而原本系统上是采用token做了登 ...
- 原码,补码,反码的概念及Java中使用那种存储方式
原码,补码,反码的概念及Java中使用那种存储方式: 原码:原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示 补码:机器数的补码可由原码得到.如果机器 ...
- 将Excel中数据导入数据库(三)
上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...
- Android开发-之数据的存储方式一
在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...
随机推荐
- Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别
今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...
- QT在windows下实现截屏操作并保存为png图片
QPixmap originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); QString format = ...
- Fast 迅捷网络 无线路由器FW323的功能设置
一.问题的提出 1.有一个无线路由器,型号:Fast 迅捷网络 无线路由器FW323 2.有三个网络层级,第一级,用一个路由器A负责对接互联网,内网IP段为192.168.1.*,网关设置192.16 ...
- CG
//设置线的宽度 CGContextSetLineWidth(ctx, 12); //设置线的连接处 (拐点) CGContextSetLineJoin(ctx, kCGLineJoinRound ) ...
- sql server版本
10.00.1600 :SQL 2008 10.50.1600:SQL 2008 R2 10.50.2500:SQL 2008 R2 SP1
- Go加密解密之RSA[转]
安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...
- 初探KMP算法
数据结构上老师也没讲这个,平常ACM比赛时我也没怎么理解,只是背会了代码--前天在博客园上看见了一篇介绍KMP的,不经意间就勾起了我的回忆,写下来吧,记得更牢. 一.理论准备 ...
- Mount NAS Storage in Linux Overview 转载
Mount NAS Storage in Linux Overview Mounting your NAS Storage to a device that runs on a Linux-based ...
- IOS开发UI基础UITableView的属性
UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...
- Hibernate中延迟加载和缓存
什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问 ...