2012-08-07 78 views
0

當我插入記錄時,我面臨以下問題: java.lang.runtimeexception unable to start activity componentinfo java.lang.nullpointerexception。我在sqlite數據庫中插入值時收到空指針異常。當我嘗試通過放置一個斷點來檢查它的值時,DatabaseHelper dh = new DatabaseHelper(this)中的dh即將出現爲空。下面是我的DatabaseHelper類的代碼和我嘗試插入值的類。我得到空指針異常,而插入數據到sqlitedatabase使用dbhelper

第一項活動:DbActivity.java

package com.example.dbhelpersimple; 

import android.os.Bundle; 
import android.provider.Contacts; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.support.v4.app.NavUtils; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase; 

public class DbActivity extends SQLiteOpenHelper { 

    public static final String COL_NAME = "name"; 
    public static final String COL_CNT = "contact"; 
    private static final String DATABASE_TABLE = "test"; 
    private static String DATABASE_NAME = "PERSONS.db"; 

    private static final String DATABASE_CREATE="CREATE TABLE test"+ 
      "(name VARCHAR(10), contact VARCHAR(10));"; 





    SQLiteDatabase db; 





    public DbActivity(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
     // TODO Auto-generated constructor stub 
    } 









    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL(DATABASE_CREATE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

     db.execSQL(DATABASE_NAME); 
     onCreate(db); 
    } 

    void addrecord(String name, String contact) 
    { 
     ContentValues cv=new ContentValues(); 
     cv.put(COL_NAME, name); 
     cv.put(COL_CNT, contact); 
     db.insert(DATABASE_TABLE, null, cv); 
     db.close(); 
    } 


    void getrecords() 
    { 
     int i; 
     //String query="SELECT * FROM test"; 
     Cursor c=db.query(DATABASE_TABLE, null, null, null, null, null, null); 
     c.moveToFirst(); 

     while(c.isAfterLast()==false) 
     { 
      Log.d("Name", c.getString(0)); 
      Log.d("Contact", c.getString(1)); 
     } 



    } 


} 

次活動:manipulateActivity.java

package com.example.dbhelpersimple; 

import android.app.Activity; 

import android.os.Bundle; 

import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

import android.widget.SimpleAdapter; 


public class manipulateActivity extends Activity{ 

    Button btn1,btn2,btn3; 

     EditText edt1,edt2; 


    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_db); 

      edt1=(EditText)findViewById(R.id.edittextname); 
      edt2=(EditText)findViewById(R.id.edittextcontact); 

    DbActivity dbact= new DbActivity(this); 

    dbact.addrecord("sagar", "111"); 




    } 

} 
+0

發佈您的logcat錯誤。 – Akshay 2012-08-07 08:04:52

+0

它可能會給你一個行號,告訴我們你粘貼的代碼中的哪一行也是:) – Nanne 2012-08-07 08:08:47

回答

1

第一個活動DbActivity.java

private final Context context; 

public DbActivity(Context context) 
    { 

    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.context = context; 

    } 
private static final String DATABASE_CREATE = 
       "create table test (_id integer primary key autoincrement, " 
       + "name text Not Null, contact text Not Null);"; 

@Override 
public void onCreate(SQLiteDatabase database) { 
    database.execSQL(DATABASE_CREATE); 


} 

次活動ManipulateActivity.java

private DbActivity dbHelper; 

private Context context; 

public ManipulateActivity(Context context) { 
    this.context = context; 
} 

dbHelper = new DbActivity(context); 
+0

@ Sagar-這將解決你的問題... – 2012-08-07 08:25:24

0

昌你DbActivity類的構造函數像下面提及。

 public DbActivity(Context context) { 
    super(context, DATABASE_NAME, null, 1); 
    // TODO Auto-generated constructor stub 
     this.myContext = context; // myContext is your context in DbActivity class 
    } 

我想你沒有得到,這就是爲什麼你得到空指針exception.Hope這有助於:)

0

嘗試下面的代碼的上下文。我認爲你在database_create語句中有問題。

private static final String DATABASE_CREATE = 
        "create table test (_id integer primary key autoincrement, " 
        + "name text Not Null, contact text Not Null);"; 
0

該代碼中存在太多不合理的含義。但是,一個接一個:

在SQLite中,沒有VARCHAR。這種類型的自動轉換爲類型TEXT,其被概述in the docs

注意,類型VARCHAR包含字符串「CHAR」,因此是 分配TEXT親和力。


在你DatabaseHelper級onUpgrade() - 方法,你有下面的代碼:

db.execSQL(DATABASE_NAME); 

由於您的DATABASE_NAME是的常數數據庫文件的只是名稱(和爲此無效SQL查詢),這將失敗。


在你addrecord() - 方法,您使用的是SQLiteDatabase -object,這是從來沒有初始化。這就是你獲得NPE的原因。

要從SQLiteOpenHelper中調用可讀/寫數據庫,請使用getReadableDatabase()getWritableDatabase()-方法。

當您的活動開始時出現此問題的原因是您在活動onCreate()-方法中使用此方法,該方法在創建活動時調用。


addrecord() - 方法的工作實現可能是這樣的:

public void addrecord(String name, String contact){ 
    ContentValues cv=new ContentValues(); 
    cv.put(COL_NAME, name); 
    cv.put(COL_CNT, contact); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.insert(DATABASE_TABLE, null, cv); 
    db.close(); 
} 
相關問題