- 浏览: 30891 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
JavaJ2me:
请问还知道别的方法,开启移动网络吗??
Android APN设置 -
Ancool:
pdf没研究,有空我看看,代码肯定是需要自己写的,除非别人已经 ...
Android打开文件 -
Ancool:
littlenewus 写道帅哥 如果打开一个html或者p ...
Android打开文件 -
littlenewus:
帅哥 如果打开一个html或者pdf type应该写什么?
Android打开文件
一、 SQLite 简介
在Android 平台上,集成了一个嵌入式关系型数据库—SQLite ,SQLite3 支持 NULL 、INTEGER 、REAL (浮点数字)、TEXT( 字符串文本) 和BLOB( 二进制对象) 数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3 也接受varchar(n) 、char(n) 、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite 最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY 的字段只能存储64 位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。
二、SQLite 的CURD
Android 提供了一个名为SQLiteDatabase 的类,该类封装了一些操作数据库的API ,使用该类可以完成对数据进行添加(Create) 、查询(Retrieve) 、更新(Update) 和删除(Delete) 操作(这些操作简称为CRUD )。对SQLiteDatabase 的学习,我们应该重点掌握execSQL() 和rawQuery() 方法。 execSQL() 方法可以执行insert 、delete 、update 和CREATE TABLE 之类有更改行为的SQL 语句; rawQuery() 方法可以执行select 语句。SQLiteDatabase 还专门提供了对应于添加、删除、更新、查询的操作方法: insert() 、delete() 、update() 和query() 。这些方法实际上是给那些不太了解SQL 语法的菜鸟使用的,对于熟悉SQL 语法的程序员而言,直接使用execSQL() 和rawQuery() 方法执行SQL 语句就能完成数据的添加、删除、更新、查询操作。
三、SQLite 的事务管理
使用SQLiteDatabase 的beginTransaction() 方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction() 方法之前使用setTransactionSuccessful() 方法设置事务的标志为成功,如果不调用setTransactionSuccessful() 方法,默认会回滚事务。
三、SQLite 创建、更新数据表
如果应用使用到了SQLite 数据库,在用户初次使用软件时,需要创建应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。在Android 系统,为我们提供了一个名为SQLiteOpenHelper 的类,该类用于对数据库版本进行管理,该类是一个抽象类,必须继承它才能使用。为了实现对数据库版本进行管理,SQLiteOpenHelper 类有两种重要的方法,分别是onCreate(SQLiteDatabase db) 和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
当调用SQLiteOpenHelper 的getWritableDatabase() 或者getReadableDatabase() 方法获取用于操作数据库的SQLiteDatabase 实例的时候,如果数据库不存在,Android 系统会自动生成一个数据库,接着调用onCreate() 方法,onCreate() 方法在初次生成数据库时才会被调用,在onCreate() 方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade() 方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的,假设数据库现在的版本是1 ,由于业务的需要,修改了数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2( 或其他数值) ,并且在onUpgrade() 方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade() 方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase() 和getReadableDatabase() 方法都可以获取一个用于操作数据库的SQLiteDatabase 实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase() 方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
四、SQLite 示例程序
我们编写一个对表(Contacts) 进行的操作来演示SQLite 的应用。
1. 创建Android 工程
Project name: AndroidSQLite
BuildTarget:Android2.1
Application name: SQLite嵌入式数据库
Package name: com.changcheng.sqlite
Create Activity: AndroidSQLite
Min SDK Version:7
2. Contact 实体
package com.changcheng.sqlite.entity;
public class Contact { private Integer _id ; private String name ; private String phone ;
public Contact() { super (); }
public Contact(String name, String phone) { this . name = name; this . phone = phone; }
public Integer get_id() { return _id ; }
public void set_id(Integer id) { _id = id; }
public String getName() { return name ; }
public void setName(String name) { this . name = name; }
public String getPhone() { return phone ; }
public void setPhone(String phone) { this . phone = phone; }
@Override public String toString() { return "Contants [id=" + _id + ", name=" + name + ", phone=" + phone + "]" ; } } |
3. 编写MyOpenHelper 类
MyOpenHelper 继承自SQLiteOpenHelper 类。我们需要创建数据表,必须重写onCreate (更新时重写onUpgrade 方法)方法,在这个方法中创建数据表。
package com.changcheng.sqlite;
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
private static final String name = "contants" ; // 数据库名称 private static final int version = 1; // 数据库版本
public MyOpenHelper(Context context) { /** * CursorFactory 指定在执行查询时获得一个游标实例的工厂类。 设置为null ,则使用系统默认的工厂类。 */ super (context, name , null , version ); }
@Override public void onCreate(SQLiteDatabase db) { // 创建contacts 表,SQL 表达式时提供的字段类型和长度仅为提高代码的可读性。 db.execSQL( "CREATE TABLE IF NOT EXISTS contacts(" + "_id integer primary key autoincrement," + "name varchar(20)," + "phone varchar(50))" ); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 仅演示用,所以先删除表然后再创建。 db.execSQL( "DROP TABLE IF EXISTS contacts" ); this .onCreate(db); } } |
4. 编写ContactsService 类
ContactsService 类主要实现对业务逻辑和数据库的操作。
package com.changcheng.sqlite.service;
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import com.changcheng.sqlite.MyOpenHelper; import com.changcheng.sqlite.entity.Contact;
public class ContactsService {
private MyOpenHelper openHelper ;
public ContactsService(Context context) { this . openHelper = new MyOpenHelper(context); }
/** * 保存 * * @param contact */ public void save(Contact contact) { String sql = "INSERT INTO contacts (name, phone) VALUES (?, ?)" ; Object[] bindArgs = { contact.getName(), contact.getPhone() }; this . openHelper .getWritableDatabase().execSQL(sql, bindArgs); }
/** * 查找 * * @param id * @return */ public Contact find(Integer id) { String sql = "SELECT _id,name, phone FROM contacts WHERE _id=?" ; String[] selectionArgs = { id + "" }; Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql, selectionArgs); if (cursor.moveToFirst()) return new Contact(cursor.getInt(0), cursor.getString(1), cursor .getString(2)); return null ; }
/** * 更新 * * @param contact */ public void update(Contact contact) { String sql = "UPDATE contacts SET name=?, phone=? WHERE _id=?" ; Object[] bindArgs = { contact.getName(), contact.getPhone(), contact.get_id() }; this . openHelper .getWritableDatabase().execSQL(sql, bindArgs); }
/** * 删除 * * @param id */ public void delete(Integer id) { String sql = "DELETE FROM contacts WHERE _id=?" ; Object[] bindArgs = { id }; this . openHelper .getReadableDatabase().execSQL(sql, bindArgs); }
/** * 获取记录数量 * * @return */ public long getCount() { String sql = "SELECT count(*) FROM contacts" ; Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql, null ); cursor.moveToFirst(); return cursor.getLong(0); }
/** * 获取分页数据 * * @param startIndex * @param maxCount * @return */ public List<Contact> getScrollData ( long startIndex, long maxCount) { String sql = "SELECT _id,name,phone FROM contacts LIMIT ?,?" ; String[] selectionArgs = { String.valueOf (startIndex), String.valueOf (maxCount) }; Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql, selectionArgs); List<Contact> contacts = new ArrayList<Contact>(); while (cursor.moveToNext()) { Contact contact = new Contact(cursor.getInt(0), cursor.getString(1), cursor.getString(2)); contacts.add(contact); } return contacts; }
/** * 获取分页数据,提供给SimpleCursorAdapter 使用。 * * @param startIndex * @param maxCount * @return */ public Cursor getScrollDataCursor( long startIndex, long maxCount) { String sql = "SELECT _id,name,phone FROM contacts LIMIT ?,?" ; String[] selectionArgs = { String.valueOf (startIndex), String.valueOf (maxCount) }; Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql, selectionArgs); return cursor; } } |
发表评论
-
Android 中 Proguard 和 JNI 的相关问题
2012-03-27 12:26 915在Android项目中用到JNI,当用了proguard后,发 ... -
Android中隐藏标题栏和状态栏
2011-03-21 14:57 1418一、隐藏标题栏 //隐藏标题栏 this.re ... -
Android APN设置
2011-01-23 21:41 1460由于Android对于APN的网络API没有公开,不过我们可以 ... -
Android原生(Native)C开发之五:zlib移植笔记
2011-01-23 20:53 1048zlib(http://www.zlib.net/)是一 ... -
Android原生(Native)C开发之四:SDL移植笔记
2011-01-23 20:48 1694SDL(Simple DirectMedia Layer ... -
Android原生(Native)C开发之三:鼠标事件篇(捕鼠记)
2011-01-23 20:41 955在做SDL至Android的移植时,键盘事件是能正常捕获到,看 ... -
Android原生(Native)C开发之二:framebuffer篇
2011-01-23 20:16 991虽然现在能通过交叉环境编译程序,并push到Android ... -
Android原生(Native)C开发之一:环境搭建篇
2011-01-23 20:12 1073Android是基于Linux的操作系统,处理器是ARM的,所 ... -
Android隐藏程序及调用
2011-01-23 14:52 1402新建一个activity,编辑AndroidMani ... -
Ubuntu下使用Android ADB
2011-01-23 14:37 1589android本身就有linux下的SDK包。 所以就方 ... -
Android各种调用
2011-01-23 13:33 8941,web 浏览器 Jav ... -
Android Intent and Intent-filter SDK file
2011-01-23 13:03 1270Android Intent and Intent-filte ... -
使用Android系统隐藏api读取*.apk程序安装包信息
2011-01-23 11:42 1140前提:我们需要得到 Android 系统源码编 ... -
Android获取手机型号和系统版本号
2011-01-18 17:19 1244手机型号和版本号获取方法: public void onC ... -
Android打开文件
2011-01-14 13:26 2689/* 在手机上打开文件的method */ p ... -
Android数据存储之二SharedPreferences
2011-01-14 11:19 916在此之前的学习内容是数据存储之一文件存储 ... -
Android数据存储之三SQLite嵌入式数据库(2)
2011-01-14 10:53 11445. 编写测试类 ... -
Android小东东收集
2011-01-14 10:06 957//设置ListView中item第一个的上面和下面两条分隔线 ...
相关推荐
1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型 例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。 除非...
一款基于Android平台下设计各个Activity布局和控件与结合SQLite轻型的嵌入式数据库使用java进行开发的一款android端的学生信息管理系统、主要包括学生信息添加、维护、查询、学生成绩添加、维护、查询、系统管理、...
嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 2 SQLite 数据库管理员 数据库实体A 表 表 数据库实体B 表 表 数据库实体 表 表 SQLite 我们已经掌握: SQLite是一款轻量级的关系型数据库,它的运算效率高...
在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下。 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的...
它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kB的存储空间,这也是Android移动设备采用SQLite数据库的重要原因之一。 SQLite 是遵守ACID的关系型数据库管理系统。这里的ACID是指数据库事务...
SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。 SQLite体系结构图如下: 编译器包括Tokenizer(词法分析器)、 Parser(语法...
嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 1 SQLite 概念: SQLite是一款轻量级的关系型数据库,它的运算效率高,占用资源少,因此比较适合在移动设备上使用。 SQLite Android为了让我们更加方便地...
本个人理财软件系统是在Android移动平台的基础上开发,提供了预算...本系统采用Android系统集成的轻量级嵌入式数据库SQLite作为数据库引擎,以实现前后台数据交互。 关键词:个人理财; Android; Java; SQLite; JSON
在Android中也支持这样的文件存储,但是现在这里主要说的还是使用SQLite存储数据,SQLite是一种跨平台的数据库,是单文件式的,如咱们平常见的最多的Access数据库,但是他有比Access更好的平台支持,并且支持分页,...
该应用程序使用本地数据库SQLite进行数据存储和管理。它具备一些基本功能,例如登录注册、增删改和注销操作。我提供的项目包含源码、APK文件和演示视频。 以下是对提供的知识点和领域的相关 1. Android Studio:...
一、使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的...
我们在使用SQLite进行数据存储查询的时候,要进行查询优化,这里就会用到索引,C端的数据量大部分情况下面虽然不是很大,但良好的索引建立习惯往往会带来不错的查询性能提升,同时在未知的将来经得住更大数据的考验...
嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 3 SQLite 内容: SQLite如何插入数据。 (1)SQL语句。insert into table…value() (2)使用SQLiteOpenHelper接口 实验 通过SQLiteOpenHelper接口insert ...
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作...SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
先介绍几个基本概念知识: Android是基于Linux内核的操作系统,是Google公司在2007年11月5... SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产
SQLite 是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销 , SQLite 可移植性好 、 很容易使用 、 很小 、 高效而且可靠 。目前在Android 系统中集成的是 SQLite3 版本 ,SQLite 不支持静态数据类型...
嵌入式Android项目设计与开发 第六章 数据存储 ——SQLite 4 SQLite 内容: SQLite如何删除数据。 (1)SQL语句。delete from table where.. (2)使用SQLiteOpenHelper接口 实验 通过SQLiteOpenHelper接口delete 来...
其中前四种都是缓存数据到本地,这篇主要讲的是使用第三种方式来实现App中的收藏功能,不过不用Android原生自带SQLite数据库来存储数据,而是使用第三方的Realm数据库来来存储数据。 Realm 本质上是一个嵌入式数据库...