web-dev-qa-db-ja.com

原因:Android.database.sqlite.SQLiteException:no such table:(code 1)Android

アプリケーションにsqliteデータベースがあります。すべてのユーザーで問題なく動作しますが、Caused by: Android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettingsエラーが発生するユーザーはほとんどいません。

以下は、dbとエラーログを作成するためのsqliteヘルパークラスです。 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:[email protected]"
                    + "&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) {

    }
}

エラーログ:

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
20
Sniper

問題は、一部のデバイスがアプリをアップグレードしているため、checkDataBase()trueを返すため、copyDataBase()を呼び出していないためです。したがって、generalSettingsテーブルを持たない以前のデータベースを使用しています。これを解決するには:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion)
  copyDatabase();
}

また、コンストラクタを更新します。

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

}
29
Ratul Ghosh

数時間を費やした後、私はこのソリューションを得ました:

1)設定>アプリケーションマネージャー

2)アプリを選択

3)データのクリア

4)アプリのアンインストール

次に、アプリをAndroid Studioから実行します

これが適切に機能することを願っています

16
Babul Mirdha

別の考えられる解決策は、Androidエミュレーターからアプリをアンインストールし、その後、再度実行することです。

アプリケーションを単に削除したい場合:

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"
7
Developer

DATABASE_VERSIONを使用していないため、このエラーが発生します

public class DatabaseHelper extends SQLiteOpenHelper {
    private static SQLiteDatabase sqliteDb;

    private static DatabaseHelper instance;

    private static final int DATABASE_VERSION = 1;

データベースに変更を加えるたびにバージョンを増やしてください。DATABASE_VERSIONを+1で増やすだけです。

6
Mehdi1991

少数のテーブル用にコーディングし、データベースをアップグレードした場合でも、アプリはクラッシュします。あなたがしなければならないことは、すべてのテーブルがデータベースの変更を作成し、DATABASE_VERSION

DatabaseHelperクラスが少ない場合( read this )、このメソッドをdbヘルパーに追加する必要があります。

@Override
public void onOpen(SQLiteDatabase db) {
    onCreate(db);
}
2
Blasanka

それはアップグレードの例外です。以前のデータベースにテーブルがあることを確認してください。そうでない場合は、作成します。 PS:このアプリを新しく開発する場合は、エミュレーターまたはデバイスからアンインストールして再インストールします。しかし、データにはお勧めできませんが失われます。

0
Hideya

1.データベースのバージョンを変更しますまたは最初にエミュレーターまたは電話でアプリをアンインストールしてから再インストールします。私はこのようにあなたの問題が解決されると思います。

0

データベースバージョン1でアプリを実行している場合、テーブル構造を変更したり、新しいテーブルを追加したりすると、データベースバージョンを2に増やし、さらに変更する場合はさらに増やす必要があるとします。

public class AppDatabase extends SQLiteOpenHelper {

    // Database Name
    private static final String DATABASE_NAME = "myDatabase";

    // Database Version
    private static final int DATABASE_VERSION = 1;    

    public AppDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
}

変更が行われた場合、このDATABASE_VERSION値を増やします。

0
Shubham Raitka

私の場合、データベース名とその作業を変更しました

0
Rashed Zzaman

DATABASE_VERSIONを更新し、アプリをアンインストールします。ここでアプリを実行します。

0
paul polash

GreenDaoを使用しているときにこのエラーが発生した場合は、アプリを一時停止してから再試行してください。これで問題が解決しました

0
Catluc