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写的小工具打开来看看,结果数据显示是正常的。如下图。
正确的显示

有时候不要怀疑自己的正确思路和想法。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值