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中SQLite应用详解

Android数据存储五种方式总结

Android开发笔记之: 数据存储方式详解

Android笔记——Android中数据的存储方式(三)的更多相关文章

  1. Android笔记——Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...

  2. Android笔记——Android中数据的存储方式(一)

    Android中数据的存储方式 对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用. 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其 ...

  3. Matlab中数据的存储方式

    简介 MATLAB提供了丰富的算法以及一个易于操作的语言,给算法研发工作者提供了很多便利.然而MATLAB在执行某些任务的时候,执行效率偏低,测试较大任务量时可能会引起较长时间的等待.未解决这个问题, ...

  4. Android的数据的存储方式

    数据的存储方式,总的来说分为三种: ① 文件存储: * SharedPreferences存储 * SD卡存储 ---- Environment * 数据库存储 ---- SQLite .MySQL. ...

  5. C语言中float,double类型,在内存中的结构(存储方式)

    C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...

  6. 讨论两种Redis中Token的存储方式

    摘要:本文讨论一个问题:存储token时,token与对应用户id谁来作为key? 问题起源问题起源于要给公司的后台管理系统添加权限管理,选用的是开源框架shiro,而原本系统上是采用token做了登 ...

  7. 原码,补码,反码的概念及Java中使用那种存储方式

    原码,补码,反码的概念及Java中使用那种存储方式: 原码:原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示 补码:机器数的补码可由原码得到.如果机器 ...

  8. 将Excel中数据导入数据库(三)

    上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...

  9. Android开发-之数据的存储方式一

    在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...

随机推荐

  1. Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别

    今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...

  2. QT在windows下实现截屏操作并保存为png图片

    QPixmap originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); QString format = ...

  3. Fast 迅捷网络 无线路由器FW323的功能设置

    一.问题的提出 1.有一个无线路由器,型号:Fast 迅捷网络 无线路由器FW323 2.有三个网络层级,第一级,用一个路由器A负责对接互联网,内网IP段为192.168.1.*,网关设置192.16 ...

  4. CG

    //设置线的宽度 CGContextSetLineWidth(ctx, 12); //设置线的连接处 (拐点) CGContextSetLineJoin(ctx, kCGLineJoinRound ) ...

  5. sql server版本

    10.00.1600 :SQL 2008 10.50.1600:SQL 2008 R2 10.50.2500:SQL 2008 R2 SP1

  6. Go加密解密之RSA[转]

    安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...

  7. 初探KMP算法

            数据结构上老师也没讲这个,平常ACM比赛时我也没怎么理解,只是背会了代码--前天在博客园上看见了一篇介绍KMP的,不经意间就勾起了我的回忆,写下来吧,记得更牢. 一.理论准备      ...

  8. 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 ...

  9. IOS开发UI基础UITableView的属性

    UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...

  10. Hibernate中延迟加载和缓存

    什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问 ...