Jelly bean中的SQLite异常但棉花糖中没有
问题描述:
我将我的应用程序升级为棉花糖,并且获得了sqlite数据库完全例外。 的数据库代码,Jelly bean中的SQLite异常但棉花糖中没有
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");
台处于棉花糖但不Jelly Bean中创建的。数据库被创建,因为我可以访问sqlite_master和android_metadata表。尝试通过添加getWritableDatabase();到Sqlitedb的构造函数。 看起来像onCreate没有执行。
斯特拉克跟踪:在棉花糖
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)
这是工作的罚款加入实时权限请求。 请帮忙。
答
从SQLite的文档
(13)SQLITE_FULL
的SQLITE_FULL结果代码表明写入不能完成,因为磁盘已满。请注意,尝试将信息写入主数据库文件时可能发生此错误,或者在写入临时磁盘文件时也可能发生此错误。有时,即使存在大量的主磁盘空间,应用程序也会遇到此错误,因为在将临时文件存储在主磁盘所占空间较小的单独分区上的系统上写入临时磁盘文件时发生错误。 https://www.sqlite.org/rescode.html#full
我猜应用程序安装在SD卡或someth
如果你的磁盘已满。磁盘空间不足
请检查这一个https://github.com/couchbase/couchbase-lite-android/issues/664 –
只是可以肯定的是,您也有清单权限? – MikeT
@MikeT:是的许可。我们刚刚升级到23,并在应用程序启动时添加了棉花糖ondemand许可请求。没有更改过sqliteDB。这里的行为差异很奇怪。 – Vignesh