2013-07-16 102 views
1

我的项目的主要目的是在第一次启动应用程序时自动创建一个数据库。 我想通过扩展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开发,所以不要骂我傻任何错误:)

+0

你可以在该应用实例中进行长时间作业。所以请在主线程中避免数据库操作。这将解决问题。 – blganesh101

+0

这是一个空指针异常错误,您没有初始化SQLiteDatabase对象。 –

+0

谢谢大家的回答。我已经阅读过,我应该在AsyncTask中执行数据库操作,但是我希望在深入之前获得基础知识。 – ClaireG

回答

0

初始化DatabaseImplementation和SQLiteDatabase内onCreate方法。

+0

太好了。感谢它的工作。还有一个问题:一旦我运行我的应用程序,数据库在哪里保存? – ClaireG

+0

有一个默认路径,你可以通过SQLiteOpenHelper直接使用db名称访问它,完整路径将如下所示:“data/data/com.example.testingdatabase/databases/youDbName” –

+0

我的意思是说,它应该在平板电脑上还是在我的工作区中? – ClaireG

0
DatabaseImplementation db ; 

SQLiteDatabase dbWrite; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    db = new DatabaseImplementation(this); 
    dbWrite = db.getWritableDatabase(); 
    insertRecords(); 


} 
0

初始化DatabaseImplementation和SQLiteDatabase在onCreate方法。

这样的:

DatabaseImplementation db ; 
SQLiteDatabase dbWrite; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    db = new DatabaseImplementation(this); 
    dbWrite = db.getWritableDatabase(); 
    insertRecords(); 


} 
相关问题