初学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写的小工具打开来看看,结果数据显示是正常的。如下图。
有时候不要怀疑自己的正确思路和想法。