2013-03-05 58 views
0

我有一个示例应用程序,它创建数据库,表并插入一行值。创建数据库时Android空指针异常

这里是我的MainActivity.java

public class MainActivity extends Activity { 

protected static final android.content.Context Context = null; 
public String ReadingMode=""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 


      SQLiteDatabase sampleDB = Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 

      sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + 
         "SampleTable " + 
         " (LastName VARCHAR, FirstName VARCHAR," + 
         " Country VARCHAR, Age INT(3));"); 

      sampleDB.execSQL("INSERT INTO " + 
         "SampleTable " + 
         " Values ('Makam','sample','India',25);"); 

      sampleDB.close();      
     } 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

} 

当调试一行行,Null pointer exception在年线附近提出:

SQLiteDatabase sampleDB = Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 

我看到sampleDB为空,而不是创建Database

我的代码有问题吗?

回答

3

要初始化您的语境与空

protected static final android.content.Context Context = null; 

所以,当您使用的是空的上下文,它会抛出一个NPE,你可以用你的活动情境设置你的环境,然后用你的上下文

Context = MainActivity.this; 

或使用此

SQLiteDatabase sampleDB = this.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 
+0

终于知道我的错误了。谢谢!!!!! – Mahe 2013-03-05 11:12:21

+0

欢迎您;) – 2013-03-05 11:13:44

1

要初始化为protected static final android.content.Context Context = null; 然后使用它作为Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null);

它会产生明显的空指针异常。

+0

谢谢!有效。 – Mahe 2013-03-05 11:12:42

1

Repalce

SQLiteDatabase sampleDB = Context.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 

SQLiteDatabase sampleDB = this.openOrCreateDatabase("WaterElectricityReading", MODE_WORLD_READABLE, null); 

原因:

  1. ActivityContext子类,所以你可以使用this
  2. openOrCreateDatabase不是一个静态方法,所以你不能使用类名来调用它。
+0

感谢您的阐述! – Mahe 2013-03-05 11:14:39