Android之数据库的创建
一、SQLite介绍
SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。
SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
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 显示
在模拟器中显示数据