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.
s'il vous plaît vérifier celui-ci https://github.com/couchbase/couchbase-lite-android/issues/664 –
Juste pour être sûr, vous avez également la permission de manifester? – MikeT
@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