• Android开发教程-SQLite数据库的使用
  • ABCD 发表于 2016/3/18 12:54:00 | 分类标签: Android开发 SQLite数据库
  •  简单说明

     1. Android
     为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

    使用步骤

    1. 数据库的创建:
    new一个继承于SQLiteOpenHelper类的对象:dbHelper = new MyDatabaseHelper(this, "User.db", null, newVersion),User.db就是数据库的名字。
    调用getWritableDatabase()或者getReadableDatabase()方法创建或者得到数据库实例,这里onCreate()方法得到执行,可以在此建表。

     2. 得到数据库实例:
    调用getWritableDatabase()或者getReadableDatabase()可以得到数据库实例

     3. 使用数据库:
    添加: 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)
     
    项目结构
    程序代码

    AndroidManifest.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.linux.sqlitesavedata">
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    </application>
    </manifest>
    MainActivity.java:
    package com.example.linux.sqlitesavedata;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    /**
    * writer: 胡红翔
    * function: sqlite数据库的使用
    */
    public class MainActivity extends AppCompatActivity {
    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);
    }
    // 创建数据库
    public void createTable(View view) {
    Log.i(TAG, "main create table");
    dbHelper.getWritableDatabase();
    }
    // 升级数据库
    public void upgrade(View view) {
    dbHelper = new MyDatabaseHelper(this, "User.db", null, ++newVersion);
    }
    // 插入数据
    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(); // 结束事务
    }
    }
    }
    MyDatabaseHelper.java
    package com.example.linux.sqlitesavedata;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    import android.widget.Toast;
    /**
    * 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:
    }
    }
    }
    activity_main.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="createTable"
    android:text="Create database" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="upgrade"
    android:text="upGrade database" />

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="insertData"
    android:text="InsertData" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="queryData"
    android:text="QuerytData" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="updateData"
    android:text="UpdatetData" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="deleteData"
    android:text="DeletetData" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="buttleInsertData"
    android:text="ButtleInsertData" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="transcation"
    android:text="Transcation" />
    </LinearLayout>
    实现原理

    数据库的创建:部分重要代码
    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方法在此执行。

    数据库文件
    位置: /data/data/<package name>/databases/
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:ABCD
  • 加入时间:2013/7/6 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮