zoukankan      html  css  js  c++  java
  • 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和CS模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

    2、独立性

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

    3、隔离性

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

    4、跨平台

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

    5、多语言接口

    SQLite数据库支持很多语言编程接口,比如CC++、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 显示

    在模拟器中显示数据

  • 相关阅读:
    软件的竞争力:性能 CQ
    2010.7.11 OA项目组一周工作报告 CQ
    2010.8.22 OA项目组一周工作报告 CQ
    2010.7.18 OA 项目组一周工作报告 CQ
    我的音乐 CQ
    2010.7.25 OA项目组一周工作报告 CQ
    JavaScript中的关于this
    递归函数的应用
    es6中的对象的可计算的属性名
    undefined 和 undeclared 的区别
  • 原文地址:https://www.cnblogs.com/lgk1002/p/6113746.html
Copyright © 2011-2022 走看看