2017-12-30 18 views
1

bekommen dies, wie ich SQLite-Daten von nicht Aktivitätsklasse speichern getApplicationContext()kippt Reihe von SQLite

public class SaveInSQLiteContacts { 

    private Context context; 

    public SaveInSQLiteContacts(Context context){ 
     this.context = context; 
    } 

    public void save(String name, String imageKey, String email, String phone, String uid){ 

     SQLiteContacts sqLiteContacts = new SQLiteContacts(context); 
     SQLiteDatabase database = sqLiteContacts.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 

     byte [] image = null; 
     if(imageKey != null) 
      image = Base64.decode(imageKey, Base64.DEFAULT); 

     contentValues.put(SQLiteContacts.KEY_NAME, name); 
     contentValues.put(SQLiteContacts.KEY_IMAGE, image); 
     contentValues.put(SQLiteContacts.KEY_EMAIL, email); 
     contentValues.put(SQLiteContacts.KEY_PHONE, phone); 
     contentValues.put(SQLiteContacts.USERID, uid); 
     database.insert(SQLiteContacts.CONTACTS, null, contentValues); 

     sqLiteContacts.close(); 
    } 
} 

verwenden und dies ist, wie I`m versucht, Daten zu erhalten, von ihm

private void checker(){ 
    SQLiteContacts sqLiteContacts = new SQLiteContacts(getApplicationContext()); 
    SQLiteDatabase database = sqLiteContacts.getWritableDatabase(); 
    Cursor cursor = database.query(SQLiteContacts.CONTACTS, null, null, null, null, null, null); 

    if(cursor != null) { 
     if (cursor.moveToFirst()) { 
      int i = cursor.getColumnIndex(SQLiteContacts.KEY_ID); 
      int itemId = cursor.getColumnIndex(SQLiteContacts.KEY_NAME); 
      int fixerId = cursor.getColumnIndex(SQLiteContacts.USERID); 

      do { 
       int id = cursor.getInt(i); 
       String itemName = cursor.getString(itemId); 
       String fixerUID = cursor.getString(fixerId); 

       Log.d("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", itemName); 
       Log.d("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", fixerUID); 
       Log.d("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", String.valueOf(id)); 
      } while (cursor.moveToNext()); 
     } 
    } 
    cursor.close(); 
    sqLite.close(); 
} 

dies was ich bekomme nachher: ​​

Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 6 columns. 
java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

was mache ich falsch?

Antwort

0

Sehen Sie sich die Warnungen in logcat an.

Haben Sie etwas, das wie dieses aussieht ?:

CursorWindow Fenster WARN ist voll: angeforderte Zuweisung x Bytes, frei Raum x Bytes x Bytes Fenstergröße

Dieses Mittel dass das Cursorobjekt größer als die zugewiesene Größe ist, die normalerweise 2 MB ist.

Und das Bild, das Sie speichern, könnte der Grund sein, dieses 2Mb-Limit zu überschreiten.

Vielleicht könnten Sie die anderen Daten und nicht das Bild abfragen und dann das Bild einzeln laden.

Wenn Sie nur die drei Spalten benötigen, die in Ihrem Code sind versuchen Sie Folgendes:

String[] columns = new String[] { SQLiteContacts.KEY_ID, SQLiteContacts.KEY_NAME, SQLiteContacts.USERID }; 
Cursor cursor = database.query(SQLiteContacts.CONTACTS, columns, null, null, null, null, null); 
+0

aber I' Es wird kein Bild von dieser Cursor-Anforderung erhalten. –

+0

Spalten - \t Zeichenfolge: Eine Liste der zurückzugebenden Spalten. Wenn Sie NULL übergeben, werden alle Spalten zurückgegeben. Es wird davon abgeraten, das Lesen von Daten aus dem Speicher zu verhindern, der nicht verwendet wird. – jeprubio

+0

In den Spalten Parameter senden Sie null, so dass es alle Spalten zurückgibt, das Bild enthalten, und deshalb übertrifft es die 2MB. Wenn Sie das Bild nicht benötigen, fragen Sie einfach nach den Spalten, die Sie in diesem Parameter benötigen. – jeprubio

0

Bitte in Logcat überprüfen unten, indem Sie statement.May ist Cursor Größe 0. Log.e("size",cursor.getCount());

+0

Ich habe überprüft, es ist 1 –

+0

Cursor Cursor = db.query (TABLE_CONTACTS, neue Zeichenfolge [] {KEY_ID, KEY_NAME, KEY_PH_NO}, KEY_ID + "=?", neue String [] {String.valueOf (id)}, null, null, null, null); Versuchen Sie es so. –