Android之数据库的创建 - 根坤

时间:2024-03-09 16:08:25

Android之数据库的创建

一、SQLite介绍

  SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.

  SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。

  SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。

 SQLite 内部结构

  图 1. SQLite 内部结构

 

  SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。

  SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。

此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。

除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。

 

二、SQLite特点

 

SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:

1、轻量级

SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

2、独立性

SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

3、隔离性

SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

4、跨平台

SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。

5、多语言接口

SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。

6、安全性

SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

 

SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。

 

三、创建数据库类

SQLiteOpenHelper

  SQLiteOpenHelper是SQLiteDatabase的一个帮助类, 用来管理数据库的创建和版本的更新。

  一般是建立一个类继承它, 并实现它的onCreate和onUpgrade方法。

  onCreate(SQLiteDatabase db) 创建数据库时调用

  onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用

  getReadableDatabase() 创建或打开一个只读数据库

  getWritableDatabase() 创建或打开一个读写数据库

 

创建数据库

 1 package com.database.weixin;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 import android.util.Log;
 7 
 8 public class MyDatabaseOpenHelper extends SQLiteOpenHelper{
 9     
10     private static final String DB_NAME = "mydata.db"; // 数据库名称
11     private static final int version = 1; // 数据库版本
12     
13     public MyDatabaseOpenHelper(Context context) {
14         super(context, DB_NAME, null, version);
15     }
16 
17     // 问题:什么时候执行
18     // 没有前生
19     @Override
20     public void onCreate(SQLiteDatabase db) {
21         //编写【从1版本到最新状态】建表语句
22         Log.i("systemout", "没有数据库,创建数据库v2.0成功");
23         String sql_message = "create table t_message (id int primary key,face varchar(50),name varchar(50),date varchar(50),content  varchar(50),noRead Integer)";
24         
25         db.execSQL(sql_message);
26         
27            for(int i = 0 ; i < 50 ; i++){
28                 
29                // 使用execSQL方式来实现
30                 String sql = "insert into t_message (id,face,name,date,content,noRead) values (?,?,?,?,?,?)";//插入操作的SQL语句
31                 
32                 Object[] obj = new Object[]{i,"houzi","black"+i,"11月28日","有空吗?今晚一起吃饭",12};
33                // 2,\'houzi\',\'black\',\'11月28日\',\'有空吗?今晚一起吃饭\',12
34                 db.execSQL(sql,obj);//执行SQL语句
35               }
36         
39     }
40 
41     @Override
42     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
43         
44     }
45     
46 }

 

这里特别的地方是通过调用了SQLiteOpenHelper类的getReadableDatabase()方法来实现创建一个数据库的

 

 1 package com.main.weixin;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import com.database.weixin.MyDatabaseOpenHelper;
 9 import com.weixin.entity.Messages;
10 
11 import android.app.Activity;
12 import android.content.ContentValues;
13 import android.database.Cursor;
14 import android.database.sqlite.SQLiteDatabase;
15 import android.os.Bundle;
16 import android.util.Log;
17 import android.view.LayoutInflater;
18 import android.view.Menu;
19 import android.view.MenuItem;
20 import android.view.View;
21 import android.view.ViewGroup;
22 import android.view.Window;
23 import android.widget.AdapterView;
24 import android.widget.AdapterView.OnItemClickListener;
25 import android.widget.BaseAdapter;
26 import android.widget.ListView;
27 import android.widget.SimpleAdapter;
28 import android.widget.TextView;
29 
30 
31 public class MainActivity extends Activity {
32     
33     private SimpleAdapter sa;
34     private BaseAdapter ba;
35     private ListView lv;
36     private List<Messages> listMessage = new ArrayList<Messages>();
37     private List<Map<String,Object>> listMessage2 = new ArrayList<Map<String,Object>>();
38 
39     @Override
40     protected void onCreate(Bundle savedInstanceState) {
41         super.onCreate(savedInstanceState);
42         requestWindowFeature(Window.FEATURE_NO_TITLE);
43         setContentView(R.layout.activity_main);
44         
45         //创建数据库
46         MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(this);
47         SQLiteDatabase db  = helper.getWritableDatabase();
48 
49         //相当于JDBC
50        Cursor cursor = db.query("t_message", null, null, null, null, null, null);
51       if(cursor.moveToFirst()){
52           do{
53                 Messages message = new Messages();
54                   message.setFace(cursor.getString(cursor.getColumnIndex("face")));
55                   message.setName(cursor.getString(cursor.getColumnIndex("name")));
56                   message.setDate(cursor.getString(cursor.getColumnIndex("date")));
57                   message.setContent(cursor.getString(cursor.getColumnIndex("content")));
58                   message.setNoRead(cursor.getInt(cursor.getColumnIndex("noRead")));
59                   listMessage.add(message);
60           }while(cursor.moveToNext());
61       }
62         
63         
64         
65         //关闭数据库连接
66         db.close();
67         
68     
69         //......后面代码上一章有,这就不展示了

 

在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的

数据库位于Android设备/data/data/package_name/databases文件夹中。

 

在图像化界面就可以查询到刚刚插入的数据

当然用cmd 也可以用sqlite3 显示

 

在模拟器中显示数据