全屏浏览
缩小浏览
回到页首

android基础---->SQLite数据库的使用

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

  SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。今天我们就开始Sqlite数据库的学习:

 

目录导航

  1.   Sqlite数据库的简单说明 
  2.   Sqlite数据库的使用步骤
  3.   Sqlite数据库项目代码
  4.   Sqlite数据库其他使用
  5.   Sqlite数据库的实现原理
  6.   友情链接

 

Sqlite数据库的简单说明

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

  此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。Android 为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

  由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库。在接下来的实例中,我们会提到。

 

Sqlite数据库的使用步骤

一、 数据库的创建:
  • new一个继承于SQLiteOpenHelper类的对象:dbHelper = new MyDatabaseHelper(this, "User.db", null, newVersion),User.db就是数据库的名字。
  • 调用getWritableDatabase()或者getReadableDatabase()方法创建或者得到数据库实例,这里onCreate()方法得到执行,可以在此建表
 二、 得到数据库实例:
  • 调用getWritableDatabase()或者getReadableDatabase()可以得到数据库实例
 三、 使用数据库:
  • 添加: db.insert(String table, String nullColumnHack, ContentValues values) 。insert方法的第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,第三个参数是一个ContentValues 对象,它提供了一系列的put()方法重载,用于向ContentValues 中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
  • 更新:db.update(Stringtable,ContentValues对象,String whereClause, String[] whereArgs);第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
  • 查询:db.query(String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy)
  • 删除:db.delete(String table, String whereClause, String[] whereArgs)
 

Sqlite数据库项目代码

 
 一、 首先我们创建一个数据库的工具类,该类继承了SQLiteOpenHelper:
MyDatabaseHelper重写onCreate和onUpgrade方法,至少方法的调用后续会讲到
/**
 * Created by Linux on 2016/3/8.
 */
public class MyDatabaseHelper extends SQLiteOpenHelper {
    private final static String TAG = "SqliteTest";
    private Context mContext;

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        Log.i(TAG, "my database helper constructor");
        mContext = context;
    }

    public static final String CREATE_USER = "create table user ("
            + "userid integer primary key autoincrement, "
            + "username text, "
            + "password text)";

    public static final String CREATE_BOOK = "create table book ("
            + "bookid integer primary key autoincrement, "
            + "bookname text, "
            + "bookpage integer)";

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.i(TAG, "my database helper create");
        db.execSQL(CREATE_USER);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    // 升級
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG, "oldVersion: " + oldVersion + ", newVersion: " + newVersion);
        switch (newVersion) {
            case 2:
                db.execSQL(CREATE_BOOK);
            case 1:
                Log.i(TAG, "Hello world.");
            default:
        }
    }
}

 

二、 在MainActivity中的onCreate方法中初始化一些信息:

private final static String TAG = "SqliteTest";
private MyDatabaseHelper dbHelper;
private static int newVersion = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "main create");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dbHelper = new MyDatabaseHelper(this, "User.db", null, newVersion);
}

 

三、 创建Sqlite数据库:

// 创建数据库
public void createTable(View view) {
    Log.i(TAG, "main create table");
    dbHelper.getWritableDatabase();
}

 

四、 数据库中插入数据:
// 插入数据
public void insertData(View view) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("username", "Huhx");
    values.put("password", "123456");
    db.insert("user", null, values);
    values.clear();
    // 开始组装第二条数据
    values.put("username", "Linux");
    values.put("password", "456789");
    db.insert("user", null, values);// 插入第二条数据
}

 

五、 数据库中查询数据:
// 查询数据
public void queryData(View view) {
    StringBuffer stringBuffer = new StringBuffer();
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Cursor cursor = db.query("user", null, null, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            // 遍历Cursor对象,取出数据并打印
            String username = cursor.getString(cursor.getColumnIndex("username"));
            String password = cursor.getString(2); //index从0开始的,password位于第三
            stringBuffer.append("username: " + username + ", password: " + password + "\n");
        } while (cursor.moveToNext());
    }
    cursor.close();
    Log.i(TAG, stringBuffer.toString());
}

 

六、 数据库中更新数据:

// 更新数据
public void updateData(View view) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("username", "胡红翔");
    db.update("user", values, "username = ?", new String[]{"Huhx"});
}
 
七、 数据库中删除数据:
// 删除数据
public void deleteData(View view) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.delete("user", "username = ?", new String[]{"Linux"});
}

 

八、 数据库中批量插入数据:

// 批量插入数据
public void buttleInsertData(View view) {
    // 不支持批量插入数据?
}

 

九、 数据库中的事务操作:
// 数据库事务
public void transcation(View view) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.beginTransaction(); // 开启事务
    try {
        db.delete("user", null, null);
        if (true) {
            // 在这里手动抛出一个异常,让事务失败
            throw new NullPointerException();
        }
        ContentValues values = new ContentValues();
        values.put("username", "liuli");
        values.put("password", "ch29");
        db.insert("user", null, values);
        db.setTransactionSuccessful(); // 事务已经执行成功
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        db.endTransaction(); // 结束事务
    }
}

 

十、 数据库的升级:

// 升级数据库
public void upgrade(View view) {
    dbHelper = new MyDatabaseHelper(this, "User.db", null, ++newVersion);
}
 

sqlite数据库其他使用

一、 数据库的高级特性

创建视图:

  视图是虚拟表,它的内容都派生自其它表的查询结果。虽然它看起来像基本表,但是它不是,因为基本表的内容是持久的,而视图的内容是使用时动态产生的。create view 表名 as 定义

创建索引:

  索引是一种用来在某种条件下加速查询的结构。通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的 schema,不需要删除表和索引 . 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。create index 索引名 on 表名(列名)

创建触发器:

  触发器的作用是当具体的表发生特定的数据事件时,执行对应的操作。
  create trigger 触发器名 [before|after] [insert|delete|update|update of columns] on 表名 action

 

二、 导出查看数据库文件

  在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/package_name/databases文件夹中。

 

三、 命令行查看sqlite数据库:真机测试没有root,不能进入数据库。

启动模拟器,命令行cd 到android-sdk-windows\platform-tools目录
adb shell    //进入模拟器
cd /data/data/yourpackagename/      //进入到软件安装目录
cd databases  //进入到数据库目录
ls   //查看现有的数据库,如果创建过应该有个XXXX.db
sqlite3 XXXX.db   //用sqlite3工具打开数据库

//下面是sqlite3命令
sqlite> .tables   //查看数据库里面的表 本例应该能看到表YYYY
sqlite> .schema YYYY   //查看表结构
sqlite> select * from YYYY;  //查询表

 

四、 查看数据库,使用SQlite Database Browser:

查看数据库

 

sqlite数据库的实现原理

一、 数据库的创建:部分重要代码

db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
                                    Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0, 
                                    mFactory, mErrorHandler);//打开或者创建数据库

 

二、  数据库的更新:部分重要代码

final int version = db.getVersion();
//新版本与当前版本不一致
if (version != mNewVersion) {
    if (db.isReadOnly()) {
        throw new SQLiteException("Can't upgrade read-only database from version " +
                db.getVersion() + " to " + mNewVersion + ": " + mName);
    }
    db.beginTransaction();
    try {
        if (version == 0) {
            onCreate(db);
        } else {
            // 新版本号小于当前版本,则执行onDowngrade方法
            if (version > mNewVersion) {
                onDowngrade(db, version, mNewVersion);
            } else {
                // 新版本号大于当前版本,则执行onUpgrade方法
                onUpgrade(db, version, mNewVersion);
            }
        }
        db.setVersion(mNewVersion);
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
} 

 

三、 数据库更新:onUpgrade方法

  version的增大, onUpgrade方法并没有因此而立即得到执行。源码中,dbHelper.getWritableDatabase()调用才会去比较版本,onUpgrade方法在此执行。

 

 1 db.beginTransaction();
 2                 try {
 3                     if (version == 0) {
 4                         onCreate(db);
 5                     } else {
 6                         if (version > mNewVersion) {
 7                             onDowngrade(db, version, mNewVersion);
 8                         } else {
 9                             onUpgrade(db, version, mNewVersion);
10                         }
11                     }
12                     db.setVersion(mNewVersion);
13                     db.setTransactionSuccessful();
14                 } finally {
15                     db.endTransaction();
16                 }

友情链接

 
posted @ 2016-03-05 15:57  huhx  阅读(2626)  评论(1编辑  收藏  举报