Java 未创建SQLite数据库..为什么?
我试图将从某些特定消息中收到的数据添加到SQLite数据库中。。 但当我运行我的应用程序时,我得到一个错误,它说。。。致命异常:主要由my DBAdapter.Java中InsertTitle函数的Java空指针异常引起 这是我的DBAdapter课程Java 未创建SQLite数据库..为什么?,java,android,sqlite,nullpointerexception,broadcastreceiver,Java,Android,Sqlite,Nullpointerexception,Broadcastreceiver,我试图将从某些特定消息中收到的数据添加到SQLite数据库中。。 但当我运行我的应用程序时,我得到一个错误,它说。。。致命异常:主要由my DBAdapter.Java中InsertTitle函数的Java空指针异常引起 这是我的DBAdapter课程 package com.lalsoft.janko; import android.content.ContentValues; import android.content.Context; import android.database.C
package com.lalsoft.janko;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter
{
public static final String KEY_ROWID = "_id";
public static final String KEY_GQTY = "gqty";
public static final String KEY_NQTY = "nqty";
public static final String KEY_DATE = "ddate";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "lalaqua";
private static final String DATABASE_TABLE = "nsales";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table titles (_id integer primary key autoincrement, "
+ "gqty text not null, nqty text not null, "
+ "ddate text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---insert a title into the database---
public long insertTitle(String gqty, String nqty, String ddate)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_GQTY, gqty);
initialValues.put(KEY_NQTY, nqty);
initialValues.put(KEY_DATE, ddate);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular title---
public boolean deleteTitle(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID +
"=" + rowId, null) > 0;
}
//---retrieves all the titles---
public Cursor getAllTitles()
{
return db.query(DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_GQTY,
KEY_NQTY,
KEY_DATE},
null,
null,
null,
null,
null);
}
//---retrieves a particular title---
public Cursor getTitle(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID,
KEY_GQTY,
KEY_NQTY,
KEY_DATE
},
KEY_ROWID + "=" + rowId,
null,
null,
null,
null,
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//---updates a title---
public boolean updateTitle(long rowId, String gqtr,
String nqty, String ddate)
{
ContentValues args = new ContentValues();
args.put(KEY_GQTY, gqtr);
args.put(KEY_NQTY, nqty);
args.put(KEY_DATE, ddate);
return db.update(DATABASE_TABLE, args,
KEY_ROWID + "=" + rowId, null) > 0;
}
}
这是从BroadcastReceiver扩展而来的类,BroadcastReceiver调用inserttitle函数
package com.lalsoft.janko;
import java.util.Calendar;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsManager;
import android.telephony.gsm.SmsMessage;
import android.util.Log;
public class SMSReceiver extends BroadcastReceiver
{
public String SendMsgBody;
private static final String LOG_TAG = "JankoSMS";
public DBAdapter db;
public Integer isDone=0;
public Double GrossQty,NetQty;
@Override
public void onReceive(Context context, Intent intent)
{
db = new DBAdapter(context);
//---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
String PhNo;
String MsgBody;
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
PhNo=msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
MsgBody=msgs[i].getMessageBody().toString();
str += "\n";
// EncodeSMS(MsgBody);
String GQtyS,NQtyS,sDate;
GQtyS="Ok";
NQtyS="Done";
sDate=getDate();
Log.i(LOG_TAG, "Date" +" "+ sDate +" "+ GQtyS +" "+ NQtyS);
long id;
id = db.insertTitle(GQtyS ,NQtyS,sDate);
}
}
}
public static String getDate()
{
Calendar c = Calendar.getInstance();
String sDate = c.get(Calendar.DAY_OF_MONTH) + "-"
+ c.get(Calendar.MONTH)
+ "-" + c.get(Calendar.YEAR);
//+ " at " + c.get(Calendar.HOUR_OF_DAY)
//+ ":" + c.get(Calendar.MINUTE);
return sDate;
}
}
package com.lalsoft.janko;
导入java.util.Calendar;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.telephony.gsm.smsmsmanager;
导入android.telephony.gsm.sms消息;
导入android.util.Log;
公共类SMSReceiver扩展了BroadcastReceiver
{
公共字符串SendMsgBody;
私有静态最终字符串日志\u TAG=“jankoms”;
公共数据库适配器数据库;
公共整数isDone=0;
公共双毛重,净数量;
@凌驾
公共void onReceive(上下文、意图)
{
db=新的DBAdapter(上下文);
//---获取传入的SMS消息---
Bundle=intent.getExtras();
SmsMessage[]msgs=null;
字符串str=“”;
字符串PhNo;
字符串MsgBody;
if(bundle!=null)
{
//---检索收到的SMS消息---
Object[]pdus=(Object[])bundle.get(“pdus”);
msgs=新SMS消息[PDU.length];
对于(inti=0;i我想您还没有调用db.open();
这就是这个方法
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
问题出在insertTitle()
方法的db.insert()
行中。必须在使用之前分配db的值,因此在使用之前,通过调用open()
作为insertTitle()方法中的第一条语句来打开数据库
您的代码如下所示
public long insertTitle(String gqty, String nqty, String ddate)
{
open();
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_GQTY, gqty);
initialValues.put(KEY_NQTY, nqty);
initialValues.put(KEY_DATE, ddate);
return db.insert(DATABASE_TABLE, null, initialValues);
}
遵循sunil&lalit提出的上述2条建议
在try-catch块中也包括以下内容,即放置db.execSQL(DATABASE_-CREATE)
public void onCreate(SQLiteDatabase db) {
System.out.println("table created....");
try{
db.execSQL(DATABASE_CREATE);
}catch (Exception e) {
// TODO: handle exception
}
}
感谢..指出这一点..但现在我得到了另一个错误。错误/数据库(31937):错误插入nqty=NQtyS gqty=GQtyS ddate=sDate错误/数据库(31937):android.Database.sqlite.SQLiteException:没有这样的表:nsales:,编译时:插入nsales(nqty,gqty,ddate)值(?,,?);可能的原因是什么???@Shijilal nsales表没有cretaed。您已经用名称标题cretaed了表,但试图用nsales插入到表中。感谢..指出..但现在我遇到另一个错误。错误/数据库(31937):插入nqty=NQtyS gqty=GQtyS ddate=sDate错误/数据库时出错(31937):android.database.sqlite.SQLiteException:没有这样的表:nsales:,编译时:插入nsales(nqty、gqty、ddate)值(?,,?);可能的原因是什么?错误本身表示没有名为nsales的表
您已将表命名为titles
。哦……这就是复制和粘贴的问题:)