收藏 分享(赏)

android__sqlite_非常实用的资料.doc

上传人:saw518 文档编号:9068060 上传时间:2019-07-22 格式:DOC 页数:18 大小:129.50KB
下载 相关 举报
android__sqlite_非常实用的资料.doc_第1页
第1页 / 共18页
android__sqlite_非常实用的资料.doc_第2页
第2页 / 共18页
android__sqlite_非常实用的资料.doc_第3页
第3页 / 共18页
android__sqlite_非常实用的资料.doc_第4页
第4页 / 共18页
android__sqlite_非常实用的资料.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、前两篇日志我已经总结了本地数据存储的前两种:文件和配置项。还剩下最后一种数据库存储SQLite。一、SQLite 简介在 Android 平台上,集成了一个嵌入式关系型数据库SQLite,SQLite3 支持NULL、INTEGER 、REAL (浮点数字)、TEXT(字符串文本)和 BLOB(二进制对象 )数据类型,虽然它支持的类型虽然只有五种,但实际上 sqlite3 也接受 varchar(n)、char(n)、decimal(p,s ) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite 最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什

2、么。例如:可以在 Integer 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为 INTEGER PRIMARY KEY的字段只能存储 64 位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。另外, SQLite在解析 CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。二、SQLite 的 CURDAndroid 提供了一个名为 SQLiteDatabase 的类,该类封装了一些操作数据库的 API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve

3、) 、更新(Update) 和删除(Delete)操作(这些操作简称为 CRUD)。对 SQLiteDatabase 的学习,我们应该重点掌握 execSQL()和 rawQuery()方法。execSQL()方法可以执行 insert、 delete、update 和 CREATE TABLE 之类有更改行为的 SQL 语句;rawQuery()方法可以执行 select 语句。SQLiteDatabase 还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete() 、update() 和 query() 。这些方法实际上是给那些不太了解 SQL 语法的菜鸟使用

4、的,对于熟悉 SQL 语法的程序员而言,直接使用 execSQL()和 rawQuery()方法执行 SQL 语句就能完成数据的添加、删除、更新、查询操作。三、SQLite 的事务管理使用 SQLiteDatabase 的 beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到 endTransaction()方法之前使用 setTransactionSuccessful() 方法设置事务的标志为成功,如果不调用 setTransaction

5、Successful() 方法,默认会回滚事务。三、SQLite 创建、更新数据表如果应用使用到了 SQLite 数据库,在用户初次使用软件时,需要创建应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。在 Android 系统,为我们提供了一个名为 SQLiteOpenHelper 的类,该类用于对数据库版本进行管理,该类是一个抽象类,必须继承它才能使用。为了实现对数据库版本进行管理,SQLiteOpenHelper 类有两种重要的方法,分别是 onCreate(SQLiteDatabasedb)和 onUpgrade(SQLiteDatabase

6、db, intoldVersion, intnewVersion)当调用 SQLiteOpenHelper 的 getWritableDatabase()或者 getReadableDatabase()方法获取用于操作数据库的 SQLiteDatabase 实例的时候,如果数据库不存在,Android 系统会自动生成一个数据库,接着调用 onCreate()方法, onCreate()方法在初次生成数据库时才会被调用,在 onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的,假设

7、数据库现在的版本是 1,由于业务的需要,修改了数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为 2(或其他数值),并且在 onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在 onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。getWritableDatabase()和 getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase 实例。但 getWritableDatabase() 方法以读写

8、方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是 getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。四、SQLite 示例程序我们编写一个对表(Contacts)进行的操作来演示 SQLite 的应用。1.创建 Android 工程Project name: AndroidSQLiteBuildTarget:Android2.1Application name: SQLite 嵌入式数据库Package

9、name: com.changcheng.sqliteCreate Activity: AndroidSQLiteMin SDK Version:72. 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

10、 = 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;Overridepublic String toString() retur

11、n “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

12、.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, na

13、me, null, version);Overridepublic void onCreate(SQLiteDatabasedb) / 创建 contacts 表,SQL 表达式时提供的字段类型和长度仅为提高代码的可读性。db.execSQL(“CREATE TABLE IF NOT EXISTS contacts(“+ “_id integer primary key autoincrement,“+ “name varchar(20),“ + “phone varchar(50)“);Overridepublic void onUpgrade(SQLiteDatabasedb, int o

14、ldVersion, 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.dat

15、abase.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)

16、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=

17、?“;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 =

18、 “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 =

19、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*

20、param maxCount* return*/public List 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)

21、;List contacts = new ArrayList();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

22、(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;5.编写测试类编写一个针对 ContactsService 的测试类

23、,测试 ContactsService 类中的各个方法是否正确。package com.changcheng.sqlite.test;import java.util.List;import com.changcheng.sqlite.MyOpenHelper;import com.changcheng.sqlite.entity.Contact;import com.changcheng.sqlite.service.ContactsService;import android.database.Cursor;import android.test.AndroidTestCase;impor

24、t android.util.Log;public class ContactsServiceTest extends AndroidTestCase private static final String TAG = “ContactsServiceTest“;/ 测试创建表public void testCreateTable() throws Throwable MyOpenHelperopenHelper = new MyOpenHelper(this.getContext();openHelper.getWritableDatabase();/ 测试 savepublic void

25、testSave() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();Contact contact1 = new Contact(null, “tom“, “13898679876“);Contact contact2 = new Contact(null, “lili“, “13041094909“);Contact contact3 = new Contact(null, “jack“, “13504258899“);Contact contact4 = new

26、 Contact(null, “heary“, “1335789789“);contactsService.save(contact1);contactsService.save(contact2);contactsService.save(contact3);contactsService.save(contact4);/ 测试 findpublic void testFind() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();Contact contact =

27、contactsService.find(1);Log.i(TAG, contact.toString();/ 测试 updatepublic void testUpdate() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();Contact contact = contactsService.find(1);contact.setPhone(“1399889955“);contactsService.update(contact);/ 测试 getCountpubl

28、ic void testGetCount() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();Log.i(TAG, contactsService.getCount() + “);/ 测试 getScrollDatapublic void testGetScrollData() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();List con

29、tacts = contactsService.getScrollData(0, 3);Log.i(TAG, contacts.toString();/ 测试 getScrollDataCursorpublic void testGetScrollDataCursor() throws Throwable ContactsServicecontactsService = new ContactsService(this.getContext();Cursor cursor = contactsService.getScrollDataCursor(0, 3);while (cursor.mov

30、eToNext() Contact contact = new Contact(cursor.getInt(0),cursor.getString(1), cursor.getString(2);Log.i(TAG, contact.toString();启用测试功能,不要忘记在 AndroidManifest.xml 文件中加入测试环境。为 application 元素添加一个子元素:,为 application 元素添加一个兄弟元素:。SQLite 数据库以单个文件存储,就像微软的 Access 数据库。有一个查看 SQLite 数据库文件的工具SQLite Developer,我们可以使

31、用它来查看数据库。Android 将创建的数据库存放在”/data/data/ com.changcheng.sqlite/databases/contacts”,我们将它导出然后使用 SQLite Developer 打开。6.分页显示数据我们在 ContactsService 类中,提供了一个获取分页数据的方法。我们将调用它获取的数据,使用ListView 组件显示出来。编辑 mail.xml:在 mail.xml 所在目录里添加一个 contactitem.xml:编辑 AndroidSQLite 类:package com.changcheng.sqlite;import java.u

32、til.ArrayList;import java.util.HashMap;import java.util.List;import com.changcheng.sqlite.R;import com.changcheng.sqlite.entity.Contact;import com.changcheng.sqlite.service.ContactsService;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.view.View;im

33、port android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class AndroidSQLite extends Activity /* Called when the activity is first created. */Overridepublic void onCreat

34、e(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 获取分页数据ContactsServicecontactsService = new ContactsService(this);List contacts = contactsService.getScrollData(0, 3);/ 获取 ListViewListView lv = (ListView) this.findViewById(R.id.listView);/ 生成 List数据List

35、data = new ArrayList();for (Contact contact : contacts) HashMap item = new HashMap();item.put(“_id“, contact.get_id();item.put(“name“, contact.getName();item.put(“phone“, contact.getPhone();data.add(item);/ 生成 AdapterSimpleAdapter adapter = new SimpleAdapter(this, data,R.layout.contactitem, new Stri

36、ng “_id“, “name“, “phone“ ,new int R.id.tv_id, R.id.tv_name, R.id.tv_phone );/ 设置 ListView 适配器lv.setAdapter(adapter);/ 为 ListView 添加事件lv.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,int position, long id) HashMap item = (HashMap) pare

37、nt.getItemAtPosition(int) id);Toast.makeText(AndroidSQLite.this, item.get(“name“).toString(),1).show(););上面编写的分页显示数据比较麻烦,Android 为我们提供了一个 SimpleCursorAdapter 类。使用它可以方便的显示分页数据。将 AndroidSQLite 类修改为:package com.changcheng.sqlite;import com.changcheng.sqlite.R;import com.changcheng.sqlite.service.Contac

38、tsService;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleCursorAdapter;public class AndroidSQLite extends Activity /* Called when the activity is first created. */Overridepublic void onCreate(Bundle saved

39、InstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);/ 获取分页数据ContactsServicecontactsService = new ContactsService(this);Cursor cursor = contactsService.getScrollDataCursor(0, 3);/ 获取 ListViewListView lv = (ListView) this.findViewById(R.id.listView);/ 创建 AdapterSimpleCursor

40、Adapter adapter = new SimpleCursorAdapter(this,R.layout.contactitem, cursor, new String “_id“, “name“,“phone“ , new int R.id.tv_id, R.id.tv_name,R.id.tv_phone );/ 设置 ListView 适配器lv.setAdapter(adapter);/ 为 ListView 添加事件lv.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,int position, long id) Cursor cursor = (Cursor) parent.getItemAtPosition(int) position);Toast.makeText(AndroidSQLite.this, cursor.getString(1), 1).show(););OK,在 Android 中的 SQLite 操作总结结束!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报