Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQlite-使用动态表_Android_Sqlite_Android Sqlite_Sqliteopenhelper - Fatal编程技术网

Android SQlite-使用动态表

Android SQlite-使用动态表,android,sqlite,android-sqlite,sqliteopenhelper,Android,Sqlite,Android Sqlite,Sqliteopenhelper,我正在构建一个Android原生移动应用程序,我需要在应用程序中使用用户输入动态创建表。通过阅读文档,我似乎无法使用SQLiteOpenHelper,因为表只需要在构造函数或onctatee()方法中创建。因此,我创建了自己的实用程序类,并初始化了SQLiteDatabase。通过这个实例,我创建了一个数据库和一个表。当我查询数据库中的表时,我得到一个错误,声明java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase 如何在不扩

我正在构建一个Android原生移动应用程序,我需要在应用程序中使用用户输入动态创建表。通过阅读文档,我似乎无法使用SQLiteOpenHelper,因为表只需要在构造函数或
onctatee()方法中创建。因此,我创建了自己的实用程序类,并初始化了SQLiteDatabase。通过这个实例,我创建了一个数据库和一个表。当我查询数据库中的表时,我得到一个错误,声明
java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase

如何在不扩展SQLiteOpenHelper类的情况下正确打开和关闭SQlite数据库。我需要查询来自不同活动的数据,这取决于对数据的需求。有适合我需要的教程吗

创建数据库

public static SQLiteDatabase phiDatebase;

public void createOrOpenDatabase(String dbNmae, Context context){
        this.dbName = dbNmae;
        try{
            uuiDatebase = context.openOrCreateDatabase(dbNmae, Context.MODE_PRIVATE, null);
            Log.i("UUI_LOG","DB CREATED");
        }
        catch(Exception e){
            e.printStackTrace();
        }

    }
要创建表

public void createSurveyTable(String tableName, String queryString){
    try{

        uuiDatebase.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + queryString + ");");
        Log.i("UUI_LOG", "TABLE CREATED");

    }
    catch (Exception e){
        e.printStackTrace();
    }

}
但当我查询表列表时,我得到了错误

Cursor res =  uuiDatebase.rawQuery( "SELECT name FROM sqlite_master WHERE type='table'", null );
res.moveToFirst();
下面是我完整的Craete DB类,创建表并获取表列表

public class UUIDBHelper {

    public static SQLiteDatabase uuiDatebase;
    public static String dbName = "";


    public void createOrOpenDatabase(String dbNmae, Context context){
        this.dbName = dbNmae;
        try{
            uuiDatebase = context.openOrCreateDatabase(dbNmae, Context.MODE_PRIVATE, null);
            Log.i("PHI_LOG","DB CREATED");
        }
        catch(Exception e){
            e.printStackTrace();
        }

    }

    public void createSurveyTable(String tableName, String queryString , boolean isCreate){
        try{
            if(isCreate) {
                uuiDatebase.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + queryString + ");");
                Log.i("PHI_LOG", "TABLE CREATED");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

    public Cursor getAllTables() {

        //SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  uuiDatebase.rawQuery( "SELECT name FROM sqlite_master WHERE type='table'", null );
        res.moveToFirst();

        return res;
    }

    public Cursor getSurveyNames(String tableName) {

        //SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  uuiDatebase.rawQuery( "SELECT survey_name FROM "+tableName+" WHERE id=0", null );
        res.moveToFirst();

        return res;
    }


}
这是Logcat结果

03-28 13:28:12.922: E/SQLiteDatabase(2837): **android.database.sqlite.SQLiteDatabaseLockedException: database is locked** (code 5): , while compiling: PRAGMA journal_mode
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1142)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1131)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:261)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at surveytool.uui.com.uuisurveytool.UUIDBHelper.createOrOpenDatabase(UUIDBHelper.java:24)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at surveytool.uui.com.uuisurveytool.ListCreatedSurvey.onResume(ListCreatedSurvey.java:54)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1241)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.Activity.performResume(Activity.java:6023)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2940)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2982)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1322)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.os.Looper.loop(Looper.java:135)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at android.app.ActivityThread.main(ActivityThread.java:5221)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at java.lang.reflect.Method.invoke(Native Method)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at java.lang.reflect.Method.invoke(Method.java:372)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-28 13:28:12.922: E/SQLiteDatabase(2837):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

基本上,如果SQLITE操作是在不使用SQLiteOpenHelper类的情况下执行的,则需要手动打开和关闭DB

public static SQLiteDatabase dbInstance ;

dbInstance = context.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
并在事务完成时关闭

dbInstance .close();

你的代码有问题。这是你一直保守的秘密。提供一个。你可以共享logcat错误吗?提供完整的类扩展sqliteHelper。这可能会让我们更好地了解原因所在。我不是在扩展sqliteHelper类。我需要根据用户输入动态创建“n”个表。甚至可以通过扩展sqliteHelper类来实现吗?谢谢,你有关闭数据库吗?