Sni*_*per 22 android android-sqlite
我们的应用程序中有一个sqlite数据库.它适用于所有用户,但很少有人遇到Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings错误.
下面是我的sqlite帮助程序类,用于创建db和错误日志.在assert/Master.db我们有表 generalSettings.但在将其复制到设备后,表格丢失了.这种情况仅发生在少数用户身上.我搜索了解决方案,但我找不到确切的解决方案.团队请帮我解决这个问题.
码:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class InstallDB extends SQLiteOpenHelper {
Context ctx;
String DBNAME;
String DBPATH;
Modules modObj = new Modules();
public InstallDB(Context context, String name) {
super(context, name, null, 1);
this.ctx = context;
this.DBNAME = name;
this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath();
Log.e("Path 1", DBPATH);
}
public void createDataBase() {
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if (!dbExist) {
synchronized (this) {
db_Read = this.getReadableDatabase();
Log.e("Path 2", this.getReadableDatabase().getPath());
db_Read.close();
copyDataBase();
Log.v("copyDataBase---", "Successfully");
}
// try {
// } catch (IOException e) {
// throw new Error("Error copying database");
// }
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DBPATH;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
} catch (Exception e) {
Log.i("SQLite Error", "database does't exist yet.");
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() {
try {
InputStream myInput = ctx.getAssets().open(DBNAME);
String outFileName = DBPATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024 * 3];
int length = 0;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
} catch (Exception e) {
Modules.stacTaceElement = e.getStackTrace();
StringWriter stackTrace1 = new StringWriter();
e.printStackTrace(new PrintWriter(stackTrace1));
System.err.println(stackTrace1);
Intent send = new Intent(Intent.ACTION_SENDTO);
String uriText;
uriText = "mailto:test@test.com"
+ "&subject=Error Report"
+ "&body="
+ stackTrace1.toString();
uriText = uriText.replace(" ", "%20");
Uri uri = Uri.parse(uriText);
send.setData(uri);
ctx.startActivity(Intent.createChooser(send, "Send mail..."));
// TODO: handle exception
}
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Run Code Online (Sandbox Code Playgroud)
错误日志:
java.lang.RuntimeException: Unable to start activity ComponentInfo{palmagent.FidelityAgent.Two/palmagent.FidelityAgent.Two.PassNew}: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
at palmagent.FidelityAgent.Two.masterDatabase.selectquery(masterDatabase.java:59)
at palmagent.FidelityAgent.Two.Modules.checkDatabase(Modules.java:28825)
at palmagent.FidelityAgent.Two.PassNew$LoaduserDetails.onPreExecute(PassNew.java:140)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
at android.os.AsyncTask.execute(AsyncTask.java:535)
at palmagent.FidelityAgent.Two.PassNew.onCreate(PassNew.java:120)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
... 11 more
Run Code Online (Sandbox Code Playgroud)
小智 31
问题是因为某些设备正在升级你的应用程序,所以checkDataBase()返回true,所以你没有打电话copyDataBase().所以你使用的是以前没有generalSettings表格的数据库.要解决这个问题:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion)
copyDatabase();
}
Run Code Online (Sandbox Code Playgroud)
并更新您的构造函数:
public InstallDB(Context context, String name) {
super(context, name, null, DB_VERSION);
// DB_VERSION is an int,update it every new build
this.ctx = context;
this.DBNAME = name;
this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath();
Log.e("Path 1", DBPATH);
}
Run Code Online (Sandbox Code Playgroud)
Bab*_*dha 17
花了几个小时后,我得到了这个解决方案:
1)设置>应用程序管理器
2)选择App
3)清除数据
4)卸载App
现在从Android Studio运行应用程序
希望这个工作正常
另一种可能的解决方案是从Android模拟器卸载应用程序,然后再次运行它.
如果您只想删除一个应用程序:
Run Code Online (Sandbox Code Playgroud)1.Start the emulator. 2.Open the Android settings app. 3.Select "Applications" (Called "Apps" on Android 4.0 or higher) 4.Select "Manage Applications" (Only on Android 3.2 or lower) 5.Select the application you want to uninstall. 6.Click "Uninstall"
小智 6
发生此错误,因为您没有使用DATABASE_VERSION
public class DatabaseHelper extends SQLiteOpenHelper {
private static SQLiteDatabase sqliteDb;
private static DatabaseHelper instance;
private static final int DATABASE_VERSION = 1;
Run Code Online (Sandbox Code Playgroud)
每次在数据库中进行更改时都要增加版本,只需将DATABASE_VERSION增加+1。
| 归档时间: |
|
| 查看次数: |
63664 次 |
| 最近记录: |