Android.SQLite數據庫:初始化數據庫並插入默認數據記錄注意點

初學Android程序。之前做VB.Net程序設計時,對SQLite有所瞭解和使用。
參考網絡上的代碼,寫了一個小程序。項目需要在數據庫初始化時候插入一些默認的數據記錄。
遇到一些錯誤。記錄此文,及供做提醒。
DBHelpr.java的寫法是這樣:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

    private String TAG = "xx";
    private SQLiteDatabase  db;

    public DBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        db = getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 當第一次創建數據庫的時候,調用該方法
        String sql = "create table tblUser(strName nvarchar(20),intAge int)";
        Log.i(TAG, "創建數據庫的日誌信息" + sql);
        db.execSQL(sql);
        Log.i(TAG, "execSQL函數用於執行插入數據。");
        db.execSQL("insert into tblUser(strName,intAge) Values('a沐19',19)");
        db.execSQL("insert into tblUser(strName,intAge) Values('a沐20',20)");

        initData();

    }

    private void initData() {
        db.execSQL("insert into tblUser(strName,intAge) Values('mu啊沐30',30)");
        db.execSQL("insert into tblUser(strName,intAge) Values('mu啊沐31',31)");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table tblUser");
        onCreate(db);
    }

    public void close() {
        if (db != null) db.close();
    }

}

程序一調用到插入記錄的函數就出錯,退出。找了很久才知道原因。
前兩句是沒問題,可以插入記錄。但是initData裏面的就有問題。

找了許久才知道,犯了一個低級的錯誤:
onCreate裏面的db和DBHelper裏面的db是兩個不同的對象。

之前一直以爲第一次調DBHelper時會自動創建數據庫,並且創建的數據庫就是你要的db。
這句話沒錯,但是在實際的DBHelper裏面,有兩個db,是不一樣的對象。
修改代碼:

package com.nfst.mulistview;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

    private String TAG = "xx";
    private SQLiteDatabase  db;

    public DBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        db = getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 當第一次創建數據庫的時候,調用該方法
        String sql = "create table tblUser(strName nvarchar(20),intAge int)";
        Log.i(TAG, "創建數據庫的日誌信息" + sql);
        db.execSQL(sql);
        Log.i(TAG, "execSQL函數用於執行插入數據。");
        db.execSQL("insert into tblUser(strName,intAge) Values('a沐19',19)");
        db.execSQL("insert into tblUser(strName,intAge) Values('a沐20',20)");
        // --方法一:賦值給this.db,否則出錯,因為兩個db是不同對象。
        this.db = db;
        initData();
        // --方法二:將db傳遞給調用方法。
        initData(db);
    }

    private void initData() {
        this.db.execSQL("insert into tblUser(strName,intAge) Values('mu啊沐30',30)");
        this.db.execSQL("insert into tblUser(strName,intAge) Values('mu啊沐31',31)");
    }

    private void initData(SQLiteDatabase db) {
        db.execSQL("insert into tblUser(strName,intAge) Values('mu沐1',21)");
        db.execSQL("insert into tblUser(strName,intAge) Values('mu沐2',22)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table tblUser");
        onCreate(db);
    }

    public void close() {
        if (db != null) db.close();
    }

}

再次測試代碼,插入成功了。
另外一個:SQLite數據打開後,發現中文是亂碼,如下圖:
亂碼
之前.Net都不會的啊。莫非編碼有問題。網上是插入前要轉換一下編碼。
Eclipse設置默認是utf-8,格式應該是沒問題,支持中文。插入數據庫後,怎麼會是亂碼呢?
之前.Net沒問題,試一試用.Net寫的小工具打開來看看,結果數據顯示是正常的。如下圖。
正確的顯示

有時候不要懷疑自己的正確思路和想法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章