gpt4 book ai didi

java - getWritableDatabase 导致 nullpointerException

转载 作者:行者123 更新时间:2023-12-02 07:36:18 28 4
gpt4 key购买 nike

我正在开发一个使用存储特定信息的数据库的项目。数据库对部分程序有效,但对其他程序则无效。当用户第一次启动程序时,他们将看到从数据库中提取的信息,并且他们还可以选择添加新信息。数据库对于这两者都工作得很好。

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

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)

NewStuff 代码:27(第 20-30 行):

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)

public DbM open() throws SQLException
{
Log.d("BmDb","open");
**db= DbMh.getWritableDatabase();**
Log.d("BmDb","Open before return");
return this;
}

我已经知道它与数据库的打开有关,但为什么它会打开并为其他 Activity 工作,但不是这个?我检查了在此之前的所有 Activity ,并且我确实关闭了所有数据库。

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

public class NewStuff extends Activity {
Context context;
**DbM db=new DbM(this);**

可能是这样,但不确定如何解决它,这是我在程序其他部分中使用的一类对象。所以我没有调用任何 oncreates 或类似的东西,这会导致我的问题吗?

*编辑*

这是我的整个 NewStuff 类(class),除了上下文之外,我一定还缺少其他东西,因为似乎没有任何效果。

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函数

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);

最佳答案

您无法将 DbM 初始化为字段,因为上下文尚未初始化

 DbM db=new DbM(this);

调用

 db=new DbM(this); 

仅在 OnCreate 中或之后。

编辑:你不能打电话

NewStuff ns= new NewStuff()

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

主要是,您通常不应该从另一个 Activity 调用一个 Activity 函数。

关于java - getWritableDatabase 导致 nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188879/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com