2012-07-27 117 views
0

我嘗試了多次實驗,並意識到在嘗試執行SQL查詢時我得到了NullPointerException。我的完整查詢是:嘗試使用db.execSQL創建數據庫時出現NullPointerException(DATABASE_CREATE)

create table transactiontable(_id integer primary key autoincrement, name text not null, reason text not null, money text not null); 

關於我哪裏出錯的建議?堆棧跟蹤是:

Caused by: java.lang.NullPointerException 
at com.example.startandroid.DBAdapter$DatabaseHelper.<init>(DBAdapter.java:110) 
at com.example.startandroid.DBAdapter.open(DBAdapter.java:43) 
at com.example.startandroid.MainActivity.onButtonClick(MainActivity.java:34) 
Not sure what is the issue. 

我的SQL適配器類是:

public class DBAdapter { 

private static final String DATABASE_NAME = "transaction.db"; 
private static final String DATABASE_TABLE = "transactiontable"; 
private static final int DATABASE_VERSION = 1; 

public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_REASON = "reason"; 
public static final String KEY_MONEY = "money"; 

private static final String DATABASE_CREATE = "create table " 
     + DATABASE_TABLE 
     + "(" 
     + KEY_ID + " integer primary key autoincrement, " 
     + KEY_NAME + " text not null, " 
     + KEY_REASON + " text not null, " 
     + KEY_MONEY + " text not null " 
     + ");"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private static SQLiteDatabase db; 

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

// Open the database 
public DBAdapter open() throws SQLException 
{ 
    DBHelper = new DatabaseHelper(context); 
    if (DBHelper != null) 
     db = DBHelper.getWritableDatabase(); 
    return this; 
} 

// Close the database 
public void close() 
{ 
    DBHelper.close(); 
} 


private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase arg0) 
    { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
    } 
} 
} 

我打電話使用代碼這個類的功能:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    db = new DBAdapter(this); 
    Log.e(TAG, "OnCreate is run"); 
    myIntent = new Intent(MainActivity.this, FrameActivity.class); 
} 

public void onButtonClick(View v) 
{ 
    try 
    { 
     Log.e(TAG, "OnButtonClick starts"); 
     if (db != null) 
     { 
      db.open(); 
      db.close(); 
     } 
    } 
    catch(SQLException e) 
    { 
     e.printStackTrace(); 
    } 
    MainActivity.this.startActivity(myIntent); 
    finish(); 
} 
+0

你在一個有效的'context'傳遞到將對DBAdapter()構造器? – 2012-07-27 18:22:16

回答

1

db是在構造函數DatabaseHelpernull。招行:

db.execSQL(DATABASE_CREATE); 

DatabaseHelperonCreate方法:

@Override 
public void onCreate(SQLiteDatabase arg0) { 
    arg0.execSQL(DATABASE_CREATE); 
} 
+0

謝謝,這工作。我想知道爲什麼db在db = new DBAdapter(this)之後爲空? – 2012-07-27 18:51:47

+0

@miteshsharma我的答案中的** db **不是指'DBAdapter',指的是'DBAdapter'中的'SQLiteDatabase'字段(您不幸命名爲* db *)。當你調用'db.open()'時,數據庫'SQLiteDatabase'字段仍然是'null',因爲它沒有指向一個有效的數據庫,並且調用'execSQL()'會拋出異常。 – Luksprog 2012-07-27 19:10:30