Android之SQLite 数据存储

来源:互联网 发布:mysql数据库视频下载 编辑:程序博客网 时间:2024/05/16 11:41

 

应用场景:
在前面几讲我们讲了Android的数据存储使用文件或SharedPreferences存储数据,除此之外呢,有时候我们需要用到一个小型的数据库用于来保存我们的一些持久型的数据。所以在在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3。因此中我们可以选择使用SQLite数据库存储数据。

SQLite概述:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

SQLite所支持的数据类型:
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 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

SQLite语句示范:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
        select * from person order by id desc
        select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘张三’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘张三‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person  where id=10

使用SQLiteOpenHelper对数据库进行版本管理
它是一个抽象类,用于对数据库版本进行控制。为了达到对数据库的一种管理我们必须继承自SQLiteOpenHelper这个抽象类。它是通过对数据库版本进行管理来实现一些需求。 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),
下面将列出一些SQLiteOpenHelper类的一些常见方法:
两个构造方法:
 
getWritableDatabase()和getReadableDatabase()的区别:
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。


SQLiteDatabase
SQLiteDatabase代表的是一个数据库(底层就是一个数据库文件),一量应用程序获得了代表指定的数据库的SQLiteDatabase对象,接下来我们就可以用它来完成管理、操作数据库了。
几个静态方法获得SQLiteDatabase对象
 
常用方法
 
Cursor类
 
它是一个接口。Cursor的中文意思可以理解为一个游标,也类似于结果集,比如我们在JDBC中的ResultSet。它有以下的常用方法
 
熟悉完上面的所有API那么我们就来看如何使用这个轻型的SQLite来完成我们的数据持久化。

实例:
实现效果:

 
Activity主要代码:
  1. package com.jiahui.sqlite;

  2. import java.util.ArrayList;
  3. import java.util.Currency;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.zip.Inflater;

  8. import com.jiahui.model.Person;

  9. import android.app.Activity;
  10. import android.content.ContentValues;
  11. import android.database.Cursor;
  12. import android.database.sqlite.SQLiteDatabase;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.view.LayoutInflater;
  17. import android.view.View;
  18. import android.view.ViewGroup;
  19. import android.widget.BaseAdapter;
  20. import android.widget.Button;
  21. import android.widget.EditText;
  22. import android.widget.ListView;
  23. import android.widget.SimpleAdapter;
  24. import android.widget.TextView;
  25. import android.widget.Toast;

  26. public class SQLiteDemoActivity extends Activity {

  27.         private Button btnAdd;
  28.         private Button btnQueryAll;
  29.         private ListView lvpersons;
  30.         private EditText edtname;
  31.         private EditText edtage;

  32.         private List<Person> persons;
  33.         private Handler handler = new Handler() {
  34.                 @Override
  35.                 public void handleMessage(Message msg) {

  36.                         //接到子线程发回来的数据,完成列表的显示
  37.                         List<Map<String, Object>> data = (List<Map<String, Object>>) msg.obj;
  38.                         SimpleAdapter simpleAdapter = new SimpleAdapter(
  39.                                         SQLiteDemoActivity.this, data, R.layout.list_item,
  40.                                         new String[] { "id", "name", "age" }, new int[] {
  41.                                                         R.id.tvid, R.id.tvname, R.id.tvage });

  42.                         lvpersons.setAdapter(simpleAdapter);
  43.                 }
  44.         };

  45.         public void onCreate(Bundle savedInstanceState) {
  46.                 super.onCreate(savedInstanceState);
  47.                 setContentView(R.layout.main);

  48.                 btnAdd = (Button) this.findViewById(R.id.btnAdd);
  49.                 btnQueryAll = (Button) this.findViewById(R.id.btnQueryAll);
  50.                 edtname = (EditText) this.findViewById(R.id.edtname);
  51.                 edtage = (EditText) this.findViewById(R.id.edtage);
  52.                 lvpersons = (ListView) this.findViewById(R.id.lvpersons);

  53.                 persons = new ArrayList<Person>();
  54.                 DBHelper dbHelper = new DBHelper(this);

  55.                 final SQLiteDatabase database = dbHelper.getWritableDatabase();

  56.                 btnAdd.setOnClickListener(new View.OnClickListener() {

  57.                         @Override
  58.                         public void onClick(View v) {

  59.                                 ContentValues values = new ContentValues();
  60.                                 values.put("name", edtname.getText().toString());
  61.                                 values.put("age", edtage.getText().toString());
  62.                                 long result = database.insert("person", null, values);

  63.                                 if (result != -1) {
  64.                                         Toast.makeText(SQLiteDemoActivity.this, "增加数据成功",
  65.                                                         Toast.LENGTH_LONG).show();
  66.                                 }

  67.                         }
  68.                 });

  69.                 btnQueryAll.setOnClickListener(new View.OnClickListener() {

  70.                         @Override
  71.                         public void onClick(View v) {

  72.                                 //查询数据可能花费太多时间交给子线程去做,在Handler完成数据的显示
  73.                                 myThread thread = new myThread(database);
  74.                                 thread.start();
  75.                         }

  76.                 });

  77.         }
  78.         class myThread extends Thread {
  79.                 private SQLiteDatabase database;
  80.                 public myThread(SQLiteDatabase database) {
  81.                         this.database = database;
  82.                 }
  83.                 public void run() {
  84.                         System.out.println("----------");
  85.                         Cursor cursor = database.query("person", new String[] { "_id",
  86.                                         "name", "age" }, null, null, null, null, null);
  87.                         while (cursor.moveToNext()) {

  88.                                 Person person = new Person();
  89.                                 person.setId(cursor.getInt(cursor.getColumnIndex("_id")));
  90.                                 person.setName(cursor.getString(cursor.getColumnIndex("name")));
  91.                                 person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
  92.                                 persons.add(person);

  93.                         }
  94.                         List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

  95.                         for (int i = 0; i < persons.size(); i++) {
  96.                                 Map<String, Object> map = new HashMap<String, Object>();

  97.                                 map.put("id", persons.get(i).getId());
  98.                                 map.put("name", persons.get(i).getName());
  99.                                 map.put("age", persons.get(i).getAge());

  100.                                 data.add(map);
  101.                                 System.out.println(persons.get(i));

  102.                         }
  103.                         Message msg = handler.obtainMessage();
  104.                         msg.obj = data;
  105.                         handler.sendMessage(msg);
  106.                 }
  107.         }
  108.         @Override
  109.         protected void onDestroy() {
  110.                 super.onDestroy();
  111.         }

  112. }
0 0
原创粉丝点击