android - Android 创建 sqlite 数据库
问题描述
我在使用简单文件来创建 sqlite db 时遇到问题。如果创建或升级了数据库,我正在记录一些我希望在日志中显示的消息,但它们没有显示。
这是代码:
package com.example.karim.myandoidapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class HomeActivity extends AppCompatActivity {
String msg = "My android app log : ";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e(msg, "onCreate() event loading activity_home view");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Log.e(msg, "onCreate() event loading activity_home view");
Context context = myandoidapp.getAppContext();
MySQLiteHelper MySQLiteHelper = new MySQLiteHelper(context);
}
private class MySQLiteHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "mydbnamesss";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("DEBUG: ", "db created at " + db.getPath());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("DEBUG: ", "db upgraded ");
}
}
}
这是我在日志中的输出:
06-14 15:02:29.122 6644-6644/com.example.karim.myandoidapp E/My android app log :: Opening HomeActivity
--------- beginning of system
06-14 15:02:29.141 6644-6644/com.example.karim.myandoidapp E/My android app log :: onCreate() event loading activity_home view
06-14 15:02:29.203 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.209 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.216 6644-6673/com.example.karim.myandoidapp D/EGL_emulation: eglMakeCurrent: 0xa22050c0: ver 3 0 (tinfo 0xa2203360)
06-14 15:02:29.218 6644-6673/com.example.karim.myandoidapp D/OpenGLRenderer: endAllActiveAnimators on 0x8eeae180 (RippleDrawable) with handle 0xa2203ac0
我在这里添加我是如何获取上下文的,以防它是相关的:
包 com.example.karim.myandoidapp;
导入android.content.Context;导入android.app.Application;
public class myandoidapp extends Application {
private static Context context;
public void onCreate() {
super.onCreate();
myandoidapp.context = getApplicationContext();
}
public static Context getAppContext() {
return myandoidapp.context;
}
}
谢谢
解决方案
onCreate
只有在尝试实际获取/打开数据库时才会调用该方法。简单的解决方法是改变:-
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
至
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.getWritableDatabase(); //<<<< this.getReadableDatabase could also be used.
}
如果您想始终拥有一个封闭的数据库,最好使用:-
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase mydb = this.getWritableDatabase();
mydb.close();
}
- 关于是否应该继续打开/关闭数据库有很多争论(我个人倾向于保持打开状态)
然后,当您实例化数据库助手时,使用MySQLiteHelper MySQLiteHelper = new MySQLiteHelper(context);
. 试图打开数据库。
请注意,该onCreate
方法仅在数据库的生命周期内调用一次,因此您只会在第一次打开数据库时获取日志消息(您可以删除应用程序的数据或卸载应用程序,这将导致onCreate
再次调用) .
onUpgrade
只有在版本号增加时才会调用该方法,并且在尝试打开/获取数据库之前不会再次调用该方法。
推荐阅读
- rust - 如何在 Rust 的子 shell 中执行命令?
- javascript - 如何在功能反应中获取 JSX 标签属性?
- aws-glue - AWS Glue 错误的时间戳值。可以更改此日期类型吗?
- python - 使用正则表达式检测可能带有撇号的单词,用 ASCII 编码?
- python - 在 Pandas 的索引中合并几乎重复的字符串行?
- r - 将不明确的字符串转换为 POSIXct
- sql - PostgreSQL 查询创建目录
- emacs - 是否可以通过 shell 中的脚本使用 url 启动 eww?
- azure - 使用 azure_keyvault_secret 无效的 Credentails 进行 Ansible 查找
- reactjs - redux useEffect 和 useDispatch 不起作用(最大调用堆栈)?