2014-12-28 11 views
0

Я получаю NullPointerException всякий раз, когда я пытаюсь вставить новые записи в БД Я не уверен, если проблема возникает при создании или открытии здесь мой SQLiteHelper класс:SQLite NullPointerException при вызове вставки()

public MySQLiteHelper(Context context){ 
    super(context, DB_NAME, null, DATABASE_VERSION); 
} 
private static final String DB_CREATE_QUERY = "CREATE TABLE "+TAB_NAME+" (" + 
     ""+COL_ID+" integer PRIMARY KEY autoincrement," + 
     ""+COL_xxxLE+" LONG," + 
     ""+COL_UxxxILE+" LONG," + 
     ""+COL_xxxFI+" LONG," + 
     ""+COL_xxxxIFI+" LONG,"+ 
     ""+COL_DATE+" DATETIME );"; 

private static final String DB_CREATE_QUERY_TEMP = "CREATE TABLE "+TAB_NAME_TEMP+" (" + 
     ""+COL_ID+" integer PRIMARY KEY autoincrement," + 
     ""+COLxxILE+" LONG," + 
     ""+COL_xxILE+" LONG," + 
     ""+COL_xxFI+" LONG," + 
     ""+COLxxxWIFI+" LONG,"+ 
     ""+COLxxxDATE+" DATETIME) ;"; 

@Override 
public void onCreate(SQLiteDatabase database){ 
    try { 
     database.execSQL(DB_CREATE_QUERY); 
     database.execSQL(DB_CREATE_QUERY_TEMP); 
    } catch (SQLiteException exc) 
    { 
     Log.e("SQL",exc.toString()); 
    } 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    Log.w("TAHA->","Upgrading database from version: "+oldVersion+" to "+newVersion+". This will destroy all existing data"); 
    db.execSQL("DROP TABLE IF EXISTS "+ TAB_NAME); 
    db.execSQL("DROP TABLE IF EXISTS "+ TAB_NAME_TEMP); 
    onCreate(db); 
} 

это мой RecordSource.java где я вставлять записи

общественного класса RecordSource {

private MySQLiteHelper dbHelper; 
private SQLiteDatabase database; 

private String[] myColumns = 
     { 
       MySQLiteHelper.xxxLE, 
       MySQLiteHelper.xxxxILE, 
       MySQLiteHelper.xxxxFI, 
       MySQLiteHelper.xxxxIFI, 
}; 
/** 
*CONSTRUCTOR 
* calling MySQLiteHelper class which maintains my DB each time 
* to make sure my DB is ready 
*/ 
public RecordSource(Context context) 
{ 
    dbHelper = new MySQLiteHelper(context); 
} 



/** 
* Open and close methods, used to free memory 
* @throws SQLiteException 
*/ 
public void open() throws SQLiteException 
{ 
    database = dbHelper.getWritableDatabase(); 

} 

public void close() 
{ 
    dbHelper.close(); 
} 


public boolean createRecord(boolean firstLaunch) 
{ 
    if(firstLaunch) 
     freshStart(); 
    else { 
     Record rec = new Record(getLastRecord("temp_record"), true); 
     insertRecord(rec, MySQLiteHelper.TAB_NAME); 
     Log.w("taha->", "another record inserted"); 
    } 
    return true; 
} 

public void freshStart() 
{ 
    Record firstRecord = new Record(); 
    insertRecord(firstRecord, MySQLiteHelper.TAB_NAME_TEMP); 
    Record rec = new Record(getLastRecord("temp_record"), true); 
    insertRecord(rec,MySQLiteHelper.TAB_NAME); 
    Log.w("taha->", "fresh record inserted"); 
} 
public boolean insertRecord(Record rec,String tab) 
{ 
    ContentValues rec_values = new ContentValues(); 
    rec_values.put(myColumns[0],rec.getDown_mobile()); 
    rec_values.put(myColumns[1],rec.getUp_mobile()); 
    rec_values.put(myColumns[2],rec.getDown_wifi()); 
    rec_values.put(myColumns[3],rec.getUp_wifi()); 

    try { 
     database.insert(tab, null, rec_values); 
    } catch (SQLiteException ex) 
    { 
     Log.w("taha->", ex.toString()); 
     return false; 
    } 
    return true; 
} 

и I C все это от MyService

Context ctx = getApplicationContext(); 

        rec = new RecordSource(context); 

это ошибка

Process: com.xx.xx.nxxr, PID: 16742 
java.lang.NullPointerException 
     at com.xxxr.RecordSource.insertRecord(RecordSource.java:105) 
     at com.xxer.RecordSource.freshStart(RecordSource.java:83) 
     at comxxxher.RecordSource.createRecord(RecordSource.java:71) 
     at com.xxxer.MyService$1.run(MyService.java:43) 

Я проверил в файле БД, и база данных существует, но переменная база всегда нулевой

+0

не могли бы вы дать нам реализацию метода insertRecord()? –

+0

Извините за это, я отредактировал мое сообщение и добавил отсутствующие методы –

+0

почему у вас в сервисе это? rec = новый RecordSource (контекст); и имя вашего контекста - ctx? –

ответ

1

изменить ваш метод createRecord() это:

public boolean createRecord(boolean firstLaunch) 
{ 
    open(); 
    if(firstLaunch) 
     freshStart(); 
    else { 
     Record rec = new Record(getLastRecord("temp_record"), true); 
     insertRecord(rec, MySQLiteHelper.TAB_NAME); 
     Log.w("taha->", "another record inserted"); 
    } 
    close(); 
return true; 
} 

для информации, которую вы должны открыть и закрыть базу данных до и после любого запроса

+0

новая ошибка в базе данных = dbHelper.getWritableDatabase(); –

+0

ok Я думаю, что нашел. в классе RecordSource измените свой собственный MySQLiteHelper dbHelper; к этому: частный SQLiteOpenHelper dbHelper; –