首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getWritableDatabase引起的空异常

getWritableDatabase引起的空异常
EN

Stack Overflow用户
提问于 2012-08-30 01:52:07
回答 2查看 454关注 0票数 0

我正在使用存储特定信息的数据库进行一个项目。数据库对程序的一部分起作用,但对其他程序却不起作用。当用户第一次启动程序时,他们将看到从db中提取的信息,他们还可以选择添加新信息。对于这两种情况,数据库都能很好地工作。

我所遇到的问题是在另一个地方添加信息。当我打开数据库时,我的程序就崩溃了。逻辑猫:

代码语言:javascript
复制
08-29 20:22:47.000: E/AndroidRuntime(3022): FATAL EXCEPTION: main
08-29 20:22:47.000: E/AndroidRuntime(3022): java.lang.NullPointerException
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.database.sqlite.SQLiteOpenHelper._getWritableDatabase(SQLiteOpenHelper.java:164)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:100)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at peices.DbM.open(DbM.java:173)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at peices.NewStuff.CreateNewUnit(NewStuff.java:27)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at carlson.msum.arch.Site$5.onClick(Site.java:231)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.view.View.performClick(View.java:2538)

纽斯塔夫代码:27(第20-30行):

代码语言:javascript
复制
bb=Lon.getText().toString();
            cc=UnitName.getText().toString();
            Log.d("Class",aa);
            Log.d("Class",bb);
            Log.d("Class",cc);
            Log.d("Class",SiteName);
            Log.d("Stuff","Before Open");
            **db.open();**
            Log.d("Stuff","Before Insert/After Open");
            db.InsertUnit(SiteName, cc, aa, bb);
            Log.d("Stuff","Before Close/After Insert");
            db.close();

DbM.java:173代码(170-176)

代码语言:javascript
复制
public DbM open() throws SQLException
{
    Log.d("BmDb","open");
    **db= DbMh.getWritableDatabase();**
    Log.d("BmDb","Open before return");
    return this;
}

我已经知道它与数据库的打开有什么关系,但它为什么要打开并用于其他活动,而不是这个呢?我检查了这个数据库之前的所有活动,并关闭了所有数据库。

这是类的开始,DbM初始化是我为所有其他类所做的。

代码语言:javascript
复制
public class NewStuff extends Activity {
Context context;
**DbM db=new DbM(this);**

有一件事是可以的,但不确定如何修复它,这是我在程序的其他部分中使用的一个对象类。所以我不会打电话给任何创建者或者类似的东西,这会导致我的问题吗?

*EDIT*

这是我的整个NewStuff类,除了上下文之外,我还缺少了其他一些东西,因为似乎什么都不起作用。

代码语言:javascript
复制
package peices;
import peices.DbM;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.app.Activity;
import android.content.Context;

public class NewStuff extends Activity {
Context context;
DbM db;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        db=new DbM(this);
        }
    public void CreateNewUnit(EditText Lat, EditText Lon, EditText UnitName, String SiteName)
    {

            db=new DbM(this);
            Log.d("NewUnit","Start of");
            String aa="";
            String bb="";
            String cc="";

            aa=Lat.getText().toString();
            bb=Lon.getText().toString();
            cc=UnitName.getText().toString();
            Log.d("Class",aa);
            Log.d("Class",bb);
            Log.d("Class",cc);
            Log.d("Class",SiteName);
            Log.d("Stuff","Before Open");
            db.open();
            Log.d("Stuff","Before Insert/After Open");
            db.InsertUnit(SiteName, cc, aa, bb);
            Log.d("Stuff","Before Close/After Insert");
            db.close();     
    }

编辑

调用NewStuff的onclick函数

代码语言:javascript
复制
ucreate.setOnClickListener(new OnClickListener(){
        public void onClick(View m){
            Log.d("Ubox","Unit Name: "+uname.getText().toString());
            Log.d("Ubox","Unit Longitude: "+ulon.getText().toString());
            Log.d("Ubox","Unit Latitude: "+ulat.getText().toString());
            Log.d("Ubox","Site Name: "+SiteName);
            NewStuff ns= new NewStuff();
            ns.CreateNewUnit(ulat,ulon,uname,SiteName);
            Intent I= new Intent(Site.this, Site.class);
            I.putExtra("SITE", SiteName);
            startActivity(I);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 01:54:23

不能将DbM初始化为字段,因为上下文不会被初始化。

代码语言:javascript
复制
 DbM db=new DbM(this);

打电话

代码语言:javascript
复制
 db=new DbM(this); 

只在OnCreate之内或之后。

编辑:您不能调用

代码语言:javascript
复制
NewStuff ns= new NewStuff()

这是因为如果您实例化自己,活动的上下文将不会被设置。因此,this no DbM(this);没有任何意义。

主要而言,您通常不应该将函数称为另一个活动的活动。

票数 1
EN

Stack Overflow用户

发布于 2012-08-30 02:29:49

这样定义db

代码语言:javascript
复制
public class NewStuff extends Activity {
Context context;
DbM db;

然后onCreate(

代码语言:javascript
复制
onCreate(){
........
   db=new DbM(this); 
}

这就是@nandeesh想告诉你的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12188879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档