0

J'ai mis à jour mon application pour marshmallow et obtenir la base de données sqlite complète exception. Le code db est,Exception SQLite dans Jelly Bean mais pas dans marshmallow

package com.app; 

import java.io.File; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.os.Environment; 
import android.util.Log; 

public class Sqlitedb extends SQLiteOpenHelper{ 

private static final String DATABASE="appname"; 
private static final int VERSION=8; 
private static final String CREATE_TABLE_TODO = "CREATE TABLE user (" + "id" + " INTEGER," + "value" + " INTEGER" + ")"; 

private static final String CREATE_TABLE_TODO1 = "CREATE TABLE trend (id INTEGER,url TEXT,image TEXT,title TEXT,count INTEGER,height TEXT,width TEXT,points INTEGER,sourceavail TEXT)"; 

private static final String CREATE_TABLE_TODO2 = "CREATE TABLE random (id INTEGER,url TEXT,image TEXT,title TEXT,count INTEGER,height TEXT,width TEXT,points INTEGER,sourceavail TEXT)"; 

public Sqlitedb(final Context context) 
{ 
     super(context, Environment.getExternalStorageDirectory() 
       + File.separator + "Appname" 
       + File.separator + DATABASE , null, VERSION); 

} 

public static SQLiteDatabase openOrCreateDatabase (String dbfile,SQLiteDatabase.CursorFactory factory) 
{ 
    return null; 
} 
@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL(CREATE_TABLE_TODO1); 
    db.execSQL(CREATE_TABLE_TODO2); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 


    if(oldVersion < 7) 
    { 
     db.execSQL("DROP TABLE IF EXISTS user"); 
     onCreate(db);   
    } 

    if(newVersion == 8){ 
     db.execSQL(CREATE_TABLE_TODO1); 
     db.execSQL(CREATE_TABLE_TODO2); 
    } 

} 

public Cursor getDetails(String table) { 
    // TODO Auto-generated method stub 
    String selectQuery = "SELECT * FROM "+table+" order by id desc"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.rawQuery(selectQuery, null); 
    return c; 
} 
public Cursor getDetails(String table,Integer integer) { 
    // TODO Auto-generated method stub 
    String selectQuery = "SELECT * FROM "+table+" where id='"+integer+"'"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.rawQuery(selectQuery, null); 
    return c; 
} 

public void deleteData(String table) { 
    // TODO Auto-generated method stub 
    SQLiteDatabase db=this.getWritableDatabase(); 
    db.delete(table, null, null); 
} 

}

De MainPage,

Sqlitedb db = new Sqlitedb(getActivity()); 
Cursor c = db.getDetails("trend"); 

Les tables sont créées dans Marshmallow mais pas dans Jelly Bean. La base de données est créée car je peux accéder aux tables sqlite_master et android_metadata. Essayé en ajoutant getWritableDatabase(); au constructeur de Sqlitedb. ressemble à onCreate n'est pas exécuté.

Strack Trace:

09-14 08:44:53.890: E/AndroidRuntime(25054): FATAL EXCEPTION: main 
09-14 08:44:53.890: E/AndroidRuntime(25054): android.database.sqlite.SQLiteFullException: database or disk is full (code 13) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:552) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:263) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at com.app.db.Sqlitedb.getDetails(Sqlitedb.java:188) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at com.app.TrendActivity.onCreateView(TrendActivity.java:119) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1016) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1197) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:535) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.view.ViewPager.populate(ViewPager.java:952) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1474) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.view.View.measure(View.java:15635) 
09-14 08:44:53.890: E/AndroidRuntime(25054): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 

Il fonctionne bien dans Marshmallow ajouté à la demande d'autorisation en temps réel. S'il vous plaît aider.

+0

s'il vous plaît vérifier celui-ci https://github.com/couchbase/couchbase-lite-android/issues/664 –

+0

Juste pour être sûr, vous avez également la permission de manifester? – MikeT

+0

@MikeT: oui autorisation en place. nous venons de passer à 23 et ajouté la demande d'autorisation de marshmallow ondemand au début de l'application. Aucune modification n'a été apportée à sqliteDB. La différence de comportement est étrange ici. – Vignesh

Répondre

0

De la documentation SQLite

(13) SQLITE_FULL

Le code de résultat SQLITE_FULL indique qu'une écriture ne pouvait pas complète car le disque est plein. Notez que cette erreur peut se produire lors de la tentative d'écriture d'informations dans le fichier de base de données principal, ou lors de l'écriture dans des fichiers disque temporaires. Parfois, les applications rencontrent cette erreur même si l'espace disque est abondant car l'erreur se produit lors de l'écriture dans des fichiers disque temporaires sur un système où les fichiers temporaires sont stockés sur une partition séparée avec beaucoup moins d'espace que le disque principal. https://www.sqlite.org/rescode.html#full

Je suppose que l'application est installée sur carte SD ou Someth

Si votre disque est plein. Vous manquiez d'espace disque

+0

l'application est installée sur la carte SD interne ayant suffisamment d'espace. Quelle est la solution possible? – Vignesh

+0

Pouvez-vous s'il vous plaît mettre à jour votre sdk et vérifier si cela résout le problème .. –

+0

SDK est la dernière version 23. – Vignesh