初學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寫的小工具打開來看看,結果數據顯示是正常的。如下圖。
有時候不要懷疑自己的正確思路和想法。