Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未创建SQLite数据库..为什么?_Java_Android_Sqlite_Nullpointerexception_Broadcastreceiver - Fatal编程技术网

Java 未创建SQLite数据库..为什么?

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

我试图将从某些特定消息中收到的数据添加到SQLite数据库中。。 但当我运行我的应用程序时,我得到一个错误,它说。。。致命异常:主要由my DBAdapter.Java中InsertTitle函数的Java空指针异常引起

这是我的DBAdapter课程

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
。哦……这就是复制和粘贴的问题:)