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文件 那么今天 ...
随机推荐
- 转 如何理解 重要性采样(importance sampling)
分类: 我叫学术帖2011-03-25 13:22 3232人阅读 评论(4) 收藏 举报 图形 重要性采样是非常有意 思的一个方法.我们首先需要明确,这个方法是基于采样的,也就是基于所谓的蒙特卡洛法 ...
- Java程序性能优化Tip
本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...
- Raspberry Pi --操作LED
最简单的一个树莓派GPIO操作入门,这里记录以下 先上连接图: 卧槽.图真特么的大 用到了GPIO的GND和#18针脚,这就不上图了,红色的线接的是18针脚,暗色的线接的是GND针脚,下面上Pytho ...
- jquery---基本标签
你觉得 jquery 有哪些好处? jQuery 是轻量级的 javascript 框架 强大的选择器 出色的 DOM 操作的封装 可靠的事件处理机制 完善的 ajax 封装 出色的浏览器的兼容性 支 ...
- Android代码优化——使用Android lint工具
作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常 ...
- winform 指定浏览器打开链接
Process myProcess = new Process(); myProcess.StartInfo.FileName = "firefox.exe";//&quo ...
- JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...
- Marven笔记贴
本篇只是作为自学Marven的笔记贴,基本上都是网上的各种资料的汇总,方便自己和需要的人,不用一个个去找浪费时间了. 什么是Marven You want to start with a projec ...
- 【MVC 过滤器的应用】ASP.NET MVC 如何统计 Action 方法的执行时间
代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; u ...
- PE渲染引擎 一
PE是我业余时间做的一个纯dx11的渲染框架.主要就是练手.如果有时间,会把它“扩展”成真正的引擎(标配至少要有个对应的编辑器吧 -_!!). 目前实现的有: obj文件加载,binormal计算. ...