Java getWritableDatabase导致nullpointerexception
我正在使用存储特定信息的数据库进行一个项目。数据库对程序的一部分有效,但对其他部分无效。当用户第一次启动程序时,他们将看到从数据库中提取的信息,并且他们还可以选择添加新信息。db在这两个方面都可以正常工作 我遇到的问题是另一个添加信息的地方。当我打开数据库时,我的程序崩溃了。 日志: 新闻代码:27(第20-30行): DbM.java的代码:173(170-176) 我已经知道它和db的开放有一些关系,但为什么它会开放并为其他活动工作,而不是这个活动?我检查了这之前的所有活动,并关闭了所有数据库 这是这个类的开始,DbM初始化是我为其他所有类所做的Java getWritableDatabase导致nullpointerexception,java,android,sql,database,Java,Android,Sql,Database,我正在使用存储特定信息的数据库进行一个项目。数据库对程序的一部分有效,但对其他部分无效。当用户第一次启动程序时,他们将看到从数据库中提取的信息,并且他们还可以选择添加新信息。db在这两个方面都可以正常工作 我遇到的问题是另一个添加信息的地方。当我打开数据库时,我的程序崩溃了。 日志: 新闻代码:27(第20-30行): DbM.java的代码:173(170-176) 我已经知道它和db的开放有一些关系,但为什么它会开放并为其他活动工作,而不是这个活动?我检查了这之前的所有活动,并关闭了所有数据
public class NewStuff extends Activity {
Context context;
**DbM db=new DbM(this);**
有一件事是可能的,但不确定如何修复它,这是我在程序的其他部分使用的一类对象。所以我没有调用任何onCreate或类似的东西,这会导致我的问题吗
*编辑*
这是我的整个NewStuff类,除了上下文之外,我肯定错过了其他一些东西,因为似乎没有任何东西起作用
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);
召唤
仅在创建后或之后
编辑:
你不能打电话
NewStuff ns= new NewStuff()
这是因为如果您自己实例化,则不会设置活动的上下文。因此this
内部新DbM(this)将没有任何意义
通常,您不应该从另一个活动中调用函数作为活动。这样定义db
public class NewStuff extends Activity {
Context context;
DbM db;
然后再次创建(
这正是@nandeesh想告诉你的。我的观点,但我没有遵循你的答案。当我尝试db=new DbM(这个);我现在得到一个VariableDeclaratorId,这意味着它找不到它的变量。我在这里遗漏了什么吗?你能展示一下Onclick函数吗?你正在用new call启动NewStuff类吗?我把调用NewStuff的Onclick函数放在了我原来的帖子中。好吧,我明白你现在说的了。不幸的是,我想要的做吧,就像你说的我不应该做的。我想做的可能更多的是在图书馆里,但我必须再看一看,以确定这是否真的是我想要的。好的,我理解你的建议。但是似乎没有任何效果。你的建议实际上甚至没有到达我的数据库,它使db.open为空指针。在过去的一个小时里,我一直在尝试各种各样的事情。所以我要用我的整个NewStuff类编辑我的第一篇文章,肯定是我做错了什么。是的,拥有完整的代码会有所帮助。也许你忘了在某个地方关闭数据库。我知道我在OnCreate之外有它们,但我使用这些函数来调用我再上一节课。也许我做错了。
DbM db=new DbM(this);
db=new DbM(this);
NewStuff ns= new NewStuff()
public class NewStuff extends Activity {
Context context;
DbM db;
onCreate(){
........
db=new DbM(this);
}