Jelly bean中的SQLite异常,但不是棉花糖中的异常

时间:2017-09-14 04:15:53

标签: android sqlite android-sqlite android-6.0-marshmallow android-4.2-jelly-bean

我将我的应用程序升级为marshmallow并获得sqlite数据库完全异常。 db代码是,

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);
}

}

来自MainPage,

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

这些表是在Marshmallow中创建的,但不是在Jelly bean中创建的。创建数据库,因为我可以访问sqlite_master和android_metadata表。通过添加getWritableDatabase()来尝试;到Sqlitedb的构造函数。 看起来像onCreate没有被执行。

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)

它在Marshmallow中正常工作,添加了实时权限请求。 请帮忙。

1 个答案:

答案 0 :(得分:0)

来自SQLite文档

(13)SQLITE_FULL

SQLITE_FULL结果代码表示由于磁盘已满而无法完成写入。请注意,尝试将信息写入主数据库文件时可能会发生此错误,或者在写入临时磁盘文件时也会发生此错误。有时,即使存在大量主磁盘空间,应用程序也会遇到此错误,因为在写入系统上的临时磁盘文件时会发生错误,临时文件存储在单独的分区上,而主磁盘的空间要小得多。 https://www.sqlite.org/rescode.html#full

我猜应用程序安装在SDCARD或其他

  

如果您的磁盘已满。您的磁盘空间不足