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文件 那么今天 ...
随机推荐
- SetHandleInformation设置内核对象标志
当父进程创建子进程时,子进程将继承父进程的内核对象.这时如果要控制子进程使用父进程的内核对象.可以使用 SetHandleInformation设置. BOOL SetHandleInformatio ...
- Part 1: Running Oracle E-Business Suite on Oracle Cloud
You can now run Oracle E-Business Suite on Oracle Cloud. EBS customers can take advantage of rapid ...
- FAILURE: Build failed with an exception.
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installD ...
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
- SQL Server 2008 Windows身份验证改为混合模式身份验证
1.在当前服务器右键进入“属性页”->“安全性”->勾选Sql Server和Windows身份验证模式->确定. 由于默认不启用sa,所以如果启用sa账户登录,则还需要如下设置: ...
- 关于鼠标事件的screenY,pageY,clientY,layerY,offsetY属性 (详细图解)
screenY 鼠标相对于显示器屏幕左上角的偏移 pageY 鼠标相对于页面左上角的偏移 (其值不会受滚动条的影响) IE9之下并不支持这个属性 但是可以写点代码计算出来. jQuery中的实现: / ...
- 前端js的书写规范和高效维护的方案_自我总结使用的方案
作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...
- js页面跳转整理(转载未整理)
js方式的页面跳转1.window.location.href方式 <script language="JavaScript" type="text/java ...
- ADO.NET学习系列(三)----做一个登录案例
总体思路.根据用户输入的用户名和密码,来判断,和数据库里面存的是不是一样,如果一样就表明登录成功,否则就登录失败. 方案一: 1.select* from 表名 where username=&quo ...
- 环信SDK与Apple Watch的结合(1)
该系列是记录在apple watch上开发IM,用到了最近挺流行的环信IM SDK. 一.先来一段网上随处可查到的信息: 1.两种分辨率 1.65寸 312*390 1.5寸 272*340 2.开发 ...