База данных SQLite не создается .. Почему? - PullRequest
0 голосов
/ 23 декабря 2011

Я пытался добавить данные, полученные из некоторых конкретных сообщений, в базу данных SQLite. Но когда я запускаю свое приложение, я получаю сообщение об ошибке ... Fatal Exception: Main вызвано исключением Java Null Pointer в функции InsertTitle в моем DBAdapter.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, который вызывает функцию 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;
}
}

Также я проверил, что база данных не создается .. Так, какова должна быть возможная причина этой проблемы и как я могу решить это? Пожалуйста, помогите мне выйти из этой проблемы.

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Проблема в строке db.insert() метода insertTitle(). You have to assign the value of db before using so use open the database before using by calling 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);
}
1 голос
/ 23 декабря 2011

Полагаю, вы не вызвали db.open();, то есть этот метод

public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}
0 голосов
/ 23 декабря 2011

Следуйте приведенным выше 2 предложениям от sunil & lalit включите ниже также место db.execSQL (DATABASE_CREATE); в блоке try catch

public void onCreate(SQLiteDatabase db) {
System.out.println("table created....");
          try{
        db.execSQL(DATABASE_CREATE);
          }catch (Exception e) {
            // TODO: handle exception
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...