我的项目的主要目的是在第一次启动应用程序时自动创建一个数据库。 我想通过扩展SQLiteOpenHelper类来创建一个简单的数据库。下面是这个类的代码:| “无法实例化活动”|
public class DatabaseImplementation extends SQLiteOpenHelper
{
private static final String DATABASE_NAME = "TestDatabase.db";
private static final int DATABASE_VERSION = 1;
private static final String createDep = "CREATE TABLE tbl_Department("+
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"department_name TEXT NOT NULL);";
private static final String createEmp = "CREATE TABLE tbl_Employee(" +
"_id INTEGER PRIMARY KEY," +
"name TEXT NOT NULL," +
"age INTEGER," +
"department_id INTEGER, "+
"FOREIGN KEY(department_id)"+
"REFERENCES tbl_Department(_id));";
public DatabaseImplementation(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(createDep);
db.execSQL(createEmp);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
//--
}
}
请不,我没有做,因为我相信没有必要为这个项目的目的,任何布局在我的布局/ main.xml中文件中声明。
以下是我的主要活动代码:
public class TestingDatabaseMain extends Activity {
DatabaseImplementation db = new DatabaseImplementation(this);
SQLiteDatabase dbWrite = db.getWritableDatabase();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
insertRecords();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.testing_database_main, menu);
return true;
}
private void insertRecords(){
ContentValues values = new ContentValues();
values.put("_id", 1);
values.put("department_name", "HR");
long newrowID = dbWrite.insert("tbl_Department", null, values);
}
}
当我运行我的Nexus 7的应用程序时,会显示以下错误:
“不幸的是,测试数据库具有停止“。
,并在logcat中的错误是:
07-16 14:14:14.240: E/AndroidRuntime(9979): FATAL EXCEPTION: main
07-16 14:14:14.240: E/AndroidRuntime(9979): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.testingdatabase/com.example.testingdatabase.TestingDatabaseMain}: java.lang.NullPointerException
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.os.Handler.dispatchMessage(Handler.java:99)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.os.Looper.loop(Looper.java:137)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-16 14:14:14.240: E/AndroidRuntime(9979): at java.lang.reflect.Method.invokeNative(Native Method)
07-16 14:14:14.240: E/AndroidRuntime(9979): at java.lang.reflect.Method.invoke(Method.java:511)
07-16 14:14:14.240: E/AndroidRuntime(9979): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-16 14:14:14.240: E/AndroidRuntime(9979): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-16 14:14:14.240: E/AndroidRuntime(9979): at dalvik.system.NativeStart.main(Native Method)
07-16 14:14:14.240: E/AndroidRuntime(9979): Caused by: java.lang.NullPointerException
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
07-16 14:14:14.240: E/AndroidRuntime(9979): at com.example.testingdatabase.TestingDatabaseMain.<init>(TestingDatabaseMain.java:13)
07-16 14:14:14.240: E/AndroidRuntime(9979): at java.lang.Class.newInstanceImpl(Native Method)
07-16 14:14:14.240: E/AndroidRuntime(9979): at java.lang.Class.newInstance(Class.java:1319)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-16 14:14:14.240: E/AndroidRuntime(9979): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-16 14:14:14.240: E/AndroidRuntime(9979): ... 11 more
07-16 14:16:47.030: W/ActivityThread(10487): Application com.example.testingdatabase is waiting for the debugger on port 8100...
我真的很感激帮助在这个问题上,即使有人可以链接我有同样的问题的其他职位。试图寻找其他几个职位,并试图追踪提供的答案无济于事。
谢谢你一堆。
编辑:我是新来的Android开发,所以不要骂我傻任何错误:)
你可以在该应用实例中进行长时间作业。所以请在主线程中避免数据库操作。这将解决问题。 – blganesh101
这是一个空指针异常错误,您没有初始化SQLiteDatabase对象。 –
谢谢大家的回答。我已经阅读过,我应该在AsyncTask中执行数据库操作,但是我希望在深入之前获得基础知识。 – ClaireG