使用SQLite数据库进行创建表时没有走onCreate()方法

问题描述

  如标题所说,我在MainActivity中创建了一个MyOpenHelper对象,本该认为此时数据库应该已经创建了,但通过Device File Explorer查看data下的文件时,没有找到database文件,Activity中代码如下.

//Activity中创建MyOpenHelper对象
private MyOpenHelper myOpenHelper;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        myOpenHelper=new MyOpenHelper(this);
        initView();
        initEvent();
    }

MyOpenHelper类如下,都在构造方法中和onCreate打出了log,但运行时只有构造方法的log.

public class MyOpenHelper extends SQLiteOpenHelper{
    public static final String DATA_NAME="myqq";
    public static final String USER_TABLE_NAME="user";
    public static final String USER_TABLE_NUMBER="number";
    public static final String USER_TABLE_IMGPATH="imgpath";
    public static final String USER_TABLE_USERNAME="username";
    public static final String USER_TABLE_TYPE="nettype";
    public static final String USER_TABLE_MSG="msg";
    public static final String USER_TABLE_SEX="sex";
    public static final String USER_TABLE_PLACE="place";
    public static final String USER_TABLE_AGE="age";
    public static final String USER_TABLE_PASSWORD="password";
    public static final String USER_TABLE_VIP="viptype";
    public static final String USER_TABLE_GROUPID="groupid";
    public static final String GROUP_TABLE_NAME="qqgroup";
    public static final String GROUP_TABLE_GROUPNAME="groupname";
    public MyOpenHelper(Context context) {
        super(context, DATA_NAME, null, 1);
        Log.e("aaa","aaaa");
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY AUTOINCREMENT,number TEXT,imgpath INTEGER,username TEXT,nettype TEXT," +
                    "msg TEXT,sex INTEGER,place TEXT,age INTEGER,password TEXT,viptype INTEGER,groupid TEXT)");
        sqLiteDatabase.execSQL("CREATE TABLE qqgroup(_id INTEGER PRIMARY KEY AUTOINCREMENT,groupname TEXT)");
        Log.e("xxxx","xxxx");
        ContentValues cv=new ContentValues();
        cv.put(GROUP_TABLE_GROUPNAME,"特别关心");
        sqLiteDatabase.insert(GROUP_TABLE_NAME,null,cv);
        ContentValues cv1=new ContentValues();
        cv1.put(GROUP_TABLE_GROUPNAME,"我的好友");
        sqLiteDatabase.insert(GROUP_TABLE_NAME,null,cv1);
        ContentValues cv2=new ContentValues();
        cv2.put(GROUP_TABLE_GROUPNAME,"大学同学");
        sqLiteDatabase.insert(GROUP_TABLE_NAME,null,cv2);
        ContentValues cv3=new ContentValues();
        cv3.put(GROUP_TABLE_GROUPNAME,"同事");
        sqLiteDatabase.insert(GROUP_TABLE_NAME,null,cv3);


        ContentValues cv4=new ContentValues();
        cv4.put(USER_TABLE_NUMBER,"4521789");
        cv4.put(USER_TABLE_IMGPATH,R.drawable.tx1);
        cv4.put(USER_TABLE_USERNAME,"徐佳鑫");
        cv4.put(USER_TABLE_TYPE,"[4G在线]");
        cv4.put(USER_TABLE_MSG,"我太难了");
        cv4.put(USER_TABLE_SEX,0);
        cv4.put(USER_TABLE_PLACE,"浙江温州");
        cv4.put(USER_TABLE_AGE,22);
        cv4.put(USER_TABLE_PASSWORD,"123456");
        cv4.put(USER_TABLE_VIP,2);
        cv4.put(USER_TABLE_GROUPID,1);
        sqLiteDatabase.insert(USER_TABLE_NAME,null,cv4);

        ContentValues cv5=new ContentValues();
        cv5.put(USER_TABLE_NUMBER,"1552542");
        cv5.put(USER_TABLE_IMGPATH,R.drawable.tx2);
        cv5.put(USER_TABLE_USERNAME,"ther");
        cv5.put(USER_TABLE_TYPE,"[WIFI在线]");
        cv5.put(USER_TABLE_MSG,"什么都没有哦");
        cv5.put(USER_TABLE_SEX,0);
        cv5.put(USER_TABLE_PLACE,"云南大理");
        cv5.put(USER_TABLE_AGE,18);
        cv5.put(USER_TABLE_PASSWORD,"123456");
        cv5.put(USER_TABLE_VIP,0);
        cv5.put(USER_TABLE_GROUPID,1);
        sqLiteDatabase.insert(USER_TABLE_NAME,null,cv5);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

解决

  在网上也寻找过办法,大部分说是因为数据库已经存在了,所以不执行onCreate方法,但我的database文件夹都不存在,之前用sqlite都没有这个问题,后来查看了之前的demo,发现在创建MyOpenHelper时下面都加了一句话,于是抱着尝试的心态试了一下,结果居然真的成功了.

SQLiteDatabase database = myOpenHelper.getWritableDatabase();

总结

 通过相关知识的了解,发现调用了getWritableDatabase()以及getReadableDatabase()才是真正创建了数据库,也就是执行onCreate()方法,在没有调用这两个方法之前,数据库是没有被创建的,由于平时都是直接创建MyOpenHelper对象,然后在各种响应事件中对数据库进行操作或者直接在创建对象后直接在下方对数据库插入一些初始数据,都没有注意过这个问题,以此文章记录这个问题.

你可能感兴趣的:(Android)