Android创建sqlite数据库
我在创建sqlite db的简单文件方面遇到了问题。 如果创建或升级了数据库,我正在记录一些我希望在日志中显示的消息,但这些消息没有显示 代码如下:Android创建sqlite数据库,android,sqlite,android-sqlite,Android,Sqlite,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; imp
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;
}
}
谢谢您的代码定义了
SQLiteOpenHelper
的子类,然后对其进行实例化,但这还不足以创建/打开SQLite数据库。如果我是你的话,我会仔细阅读谷歌的新图书馆。它是一个非常棒的库,可以帮助您创建和维护SQLite数据库,所需的工作量远远少于手动创建自己的SQLiteOpenHelper
、维护迁移等实例。只有在尝试实际获取/打开数据库时才会调用onCreate
方法。简单的解决办法是改变:-
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
到
- 关于是否应该继续打开/关闭数据库,存在许多争论(就我个人而言,我倾向于保持数据库的打开状态)
MySQLiteHelper MySQLiteHelper=newmysqlitehelper(上下文)代码>。试图打开数据库
请注意,onCreate
方法在数据库的生命周期内只调用一次,因此您只能在第一次打开数据库时获得日志消息(您可以删除应用程序的数据或卸载应用程序,这将导致再次调用onCreate
)
只有当版本号增加时才会调用onUpgrade
方法,并且直到尝试打开/获取数据库时才会调用该方法。我正在学习android的基本步骤。我认为这比学习orm容易,但我会尝试一下。谢谢,这是可以理解的。我保证,处理所有低级的SQLiteOpenHelper
东西时,房间更容易学习。我们真的很接近。我用获取上下文的类更新了我的帖子:我收到以下错误消息:java.lang.RuntimeException:无法启动活动组件信息{com.example.karim.myandoidapp/com.example.karim.myandoidapp.HomeActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.io.File android.content.Context.getDatabasePath(java.lang.String)”,更改两行Context Context=myandoidapp.getAppContext();MySQLiteHelper MySQLiteHelper=新的MySQLiteHelper(上下文)
只需MySQLiteHelper-MySQLiteHelper=newmysqlitehelper(这个)代码>
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();
}