zoukankan      html  css  js  c++  java
  • android sqlite (上)

    首先,说一下SQLite的概念:

    SQLite 是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销 , SQLite 可移植性好 、 很容易使用 、 很小 、 高效而且可靠 。目前在Android 系统中集成的是 SQLite3 版本 ,SQLite 不支持静态数据类型 , 而是使用列关系 。 这意味着它的数据类型不具有表列属性 , 而具有数据本身的属性 。 当某个值插入数据库时, SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成列类型。如果不能转换,则该值将作为其本身具有的类型存储。SQLite 支持 NULL 、INTEGER 、 REAL 、 TEXT 和 BLOB 数据类型。例如:可以在 Integer 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但是有一种例外,如果你的主键是 INTEGER ,那么只能存储 6 4位整数 , 当向这种字段中保存除整数以外的数据时, 将会产生错误 。 另外 , SQLite 在解 析REATE TABLE语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。

    SQLite 的特点

    SQlite数据库总结起来有五大特点:

    1. 零配置

    SQlite3不用安装、不用配置、不用启动、关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,在下次使用数据库的时候自动恢复。

    2. 可移植

    它是运行在 Windows 、 Linux 、BSD 、 Mac OS X 和一些商用 Unix 系统, 比如 Sun 的 Solaris 、IBM 的 AIX ,同样,它也可以工作在许多嵌入式操作系统下,比如 Android 、 QNX 、VxWorks、 Palm OS 、 Symbin 和 Windows CE 。

    3. 紧凑

    SQLite是被设计成轻量级、自包含的。一个头文件、一个 lib 库,你就可以使用关系数据库了,不用任何启动任何系统进程。

    4. 简单

    SQLite有着简单易用的 API 接口。

    5. 可靠

    SQLite的源码达到 100% 分支测试覆盖率。

    ------------------------------------------

    要操SQLite,我们需要继承SQLiteOpenHelper,然后通过继承类来获取SQLiteDatabase对象,从而来达到操作SQLite数据

    的目标。如果要打开SQLite数据库,可以使用

    SQLite.Expert.Professional

    来打开,这里附上地址 http://download.csdn.net/detail/draem0507/5311550(如果没有积分的话,可以单独私信或则mail我,我会第一时间发给你的O(∩_∩)O哈!)

    创建一个继承类 SQLiteOpenHelper

     SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法

      onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。

      onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。

      实现代码:

     1 /**
     2  * @author  draem0507@gmail.com
     3  * @TODO    
     4  * @version 1.0
     5  * @date 2013-4-28上午09:37:13    
     6  * myblog:http://www.cnblogs.com/draem0507
     7  */
     8 public class DataBaseHelper extends SQLiteOpenHelper {
     9     private static final String TAG=DataBaseHelper.class.getName();
    10     private final static int VERSION=1;
    11     private String sql="create table if not exists t_user(id int primary key,name varchar2(100))";
    12 
    13     //必须要重写
    14     public DataBaseHelper(Context context, String name, CursorFactory factory,
    15             int version) {
    16         
    17         super(context, name, factory, version);
    18         // TODO Auto-generated constructor stub
    19     }
    20     
    21     public DataBaseHelper(Context context, String name,
    22             int version) {
    23         this(context, name, null, version);
    24         // TODO Auto-generated constructor stub
    25     }
    26     public DataBaseHelper(Context context, String name) {
    27         this(context, name, null, VERSION);
    28         // TODO Auto-generated constructor stub
    29     }
    30     
    31 
    32     //第一次创建的时候调用
    33     @Override
    34     public void onCreate(SQLiteDatabase db) {
    35         Log.e(TAG, "创建数据库");
    36         db.execSQL(sql);
    37         
    38     }
    39     //更新数据库的时候调用
    40     @Override
    41     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    42         // TODO Auto-generated method stub
    43         Log.e(TAG, "更新数据库");
    44         
    45     }
    46 
    47 }

     SQLiteDatabase操作数据

    接着,我们就要调用这个继承类来进行操作了

    Android提供了一个名为SQLiteDatabase的类,它封装了一些操作数据库的API。使用它能实现基本的CRUD操作,通过getWritableDatabase()和getReadableDatabase()可以获取数据库实例。

    实现代码

      1 public class SqliteActivity extends Activity {
      2     private Button mcreateBt;
      3     private Button mupdateBt;
      4     private Button minsertBt;
      5     private Button meditBt;
      6     private Button mqueryBt;
      7     private Button mcloseBt;
      8     private DataBaseHelper baseHelper;
      9     private SQLiteDatabase database;
     10     private static final String TAG = SqliteActivity.class.getName();
     11 
     12     /** Called when the activity is first created. */
     13     @Override
     14     public void onCreate(Bundle savedInstanceState) {
     15         super.onCreate(savedInstanceState);
     16         setContentView(R.layout.main);
     17         
     18         mcreateBt = (Button) findViewById(R.id.createBt);
     19         mupdateBt = (Button) findViewById(R.id.updateBt);
     20         minsertBt = (Button) findViewById(R.id.insertBt);
     21         meditBt = (Button) findViewById(R.id.editBt);
     22         mqueryBt = (Button) findViewById(R.id.queryBt);
     23         mcloseBt = (Button) findViewById(R.id.closeBt);
     24 
     25         mcreateBt.setOnClickListener(new BtListener());
     26         mupdateBt.setOnClickListener(new BtListener());
     27         meditBt.setOnClickListener(new BtListener());
     28         minsertBt.setOnClickListener(new BtListener());
     29         mqueryBt.setOnClickListener(new BtListener());
     30         mcloseBt.setOnClickListener(new BtListener());
     31 
     32         // 初始化
     33 
     34     }
     35 
     36     class BtListener implements View.OnClickListener {
     37 
     38         @Override
     39         public void onClick(View v) {
     40             // TODO Auto-generated method stub
     41             int id = v.getId();
     42             //Toast.makeText(SqliteActivity.this, ""+id, 1).show();
     43             switch (id) {
     44             case R.id.createBt:
     45                 Log.e(TAG, "触发创建数据库事件");
     46                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db");
     47                 database = baseHelper.getReadableDatabase();
     48                 break;
     49             case R.id.updateBt:
     50                 Log.e(TAG, "触发更新数据库事件");
     51                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
     52                 database = baseHelper.getReadableDatabase();
     53                 break;
     54             case R.id.insertBt:
     55                 Log.e(TAG, "触发新增数据事件");
     56                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
     57                 database = baseHelper.getWritableDatabase();
     58                 ContentValues values = new ContentValues();
     59                 values.put("id", "1");
     60                 values.put("name", "draem0507");
     61                 database.insert("t_user", null, values);
     62                 break;
     63             case R.id.editBt:
     64                 Log.e(TAG, "触发修改数据事件");
     65                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
     66                 database = baseHelper.getWritableDatabase();
     67                 // values = new ContentValues();
     68                 //values.put("name", "lwx");
     69                 //database.update("t_user", values, "id=?", new String []{"1"});
     70                 database.execSQL("update t_user set name=? where id=?", new String[]{"draem0507","1"});
     71                     
     72                 break;
     73             case R.id.queryBt:
     74                 Log.e(TAG, "触发查询数据事件");
     75                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
     76                 database = baseHelper.getReadableDatabase();
     77                 // 第一个参数String:表名
     78                 // 第二个参数String[]:要查询的列名
     79                 // 第三个参数String:查询条件
     80                 // 第四个参数String[]:查询条件的参数
     81                 // 第五个参数String:对查询的结果进行分组
     82                 // 第六个参数String:对分组的结果进行限制
     83                 // 第七个参数String:对查询的结果进行排序
     84                 Cursor cursor=database.query("t_user", new String[] { "id,name" }, "id=?",
     85                         new String[] { "1" }, null, null, null);
     86                 while (cursor.moveToNext()) {
     87                     //cursor.getString(cursor.getColumnIndex("id"));
     88                     int userId =cursor.getInt(0);
     89                     String name=cursor.getString(1);
     90                     Log.v(TAG, "userId="+userId+"\tname="+name);
     91                     
     92                 }
     93                 break;
     94             case R.id.closeBt:
     95                 Log.e(TAG, "触发关闭数据事件");
     96                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
     97                 database = baseHelper.getReadableDatabase();
     98                 database.close();
     99                 break;
    100 
    101             }
    102 
    103         }
    104 
    105     }
    106 }

    这样,我们就可以完成对SQlite的简单的操作。

    补充几点:创建好的SQLite数据库文件地址是在data/data/包名/databases/创建的数据库文件

    可以使用pull来抽取出数据库文件,然后通过SQLiteExpertPro来打开,并且默认SQLite数据库会有一个android_metadata表。当然也可以通过DDMS的File  Explorer来获取数据库。具体看下面的截图吧

    如果觉得文章有点错乱,可以看下别人写的 仅供参考

    http://www.cnblogs.com/xqhppt/archive/2010/11/01/1866670.html

    http://byandby.iteye.com/blog/835580

  • 相关阅读:
    Maven下java.lang.NoClassDefFoundError
    FastDFS的配置、部署与API使用解读(5)FastDFS配置详解之Tracker配置(转)
    FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)
    FastDFS的配置、部署与API使用解读(3)以流的方式上传文件的客户端代码(转)
    FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码(转)
    FastDFS的配置、部署与API使用解读(1)Get Started with FastDFS(转)
    软件测试全景图(转)
    让Quality Center走下神坛--测试管理工具大PK(转)
    测试管理杂谈之理论篇(转)
    管理杂谈之理论篇(转)
  • 原文地址:https://www.cnblogs.com/draem0507/p/3049481.html
Copyright © 2011-2022 走看看