Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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 getDatabase_Android_Sqlite - Fatal编程技术网

递归调用Android getDatabase

递归调用Android getDatabase,android,sqlite,Android,Sqlite,getReadableDatabase()方法有问题。在我的一个方法中调用时,它抛出: 06-12 13:58:54.000: E/AndroidRuntime(31845): Caused by: java.lang.IllegalStateException: getDatabase called recursively 以下是完整的LogCat输出: 06-12 13:58:54.000: E/AndroidRuntime(31845): FATAL EXCEPTION: main 06

getReadableDatabase()方法有问题。在我的一个方法中调用时,它抛出:

06-12 13:58:54.000: E/AndroidRuntime(31845): Caused by: java.lang.IllegalStateException: getDatabase called recursively
以下是完整的LogCat输出:

06-12 13:58:54.000: E/AndroidRuntime(31845): FATAL EXCEPTION: main
06-12 13:58:54.000: E/AndroidRuntime(31845): java.lang.IllegalStateException: Could not execute method of the activity
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.view.View$1.onClick(View.java:3691)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.view.View.performClick(View.java:4211)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.view.View$PerformClick.run(View.java:17267)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.os.Handler.handleCallback(Handler.java:615)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.os.Looper.loop(Looper.java:137)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.app.ActivityThread.main(ActivityThread.java:4898)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at java.lang.reflect.Method.invokeNative(Native Method)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at java.lang.reflect.Method.invoke(Method.java:511)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at dalvik.system.NativeStart.main(Native Method)
06-12 13:58:54.000: E/AndroidRuntime(31845): Caused by: java.lang.reflect.InvocationTargetException
06-12 13:58:54.000: E/AndroidRuntime(31845):    at java.lang.reflect.Method.invokeNative(Native Method)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at java.lang.reflect.Method.invoke(Method.java:511)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.view.View$1.onClick(View.java:3686)
06-12 13:58:54.000: E/AndroidRuntime(31845):    ... 11 more
06-12 13:58:54.000: E/AndroidRuntime(31845): Caused by: java.lang.IllegalStateException: getDatabase called recursively
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SQLiteConnector.getDBNames(SQLiteConnector.java:538)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SQLiteConnector.onCreate(SQLiteConnector.java:53)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SQLiteConnector.getStudent(SQLiteConnector.java:501)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SQLiteConnector.setAverageGrade(SQLiteConnector.java:448)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SqlTest.testStudent(SqlTest.java:56)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.stisysManager.persistenz.SqlTest.runTest(SqlTest.java:29)
06-12 13:58:54.000: E/AndroidRuntime(31845):    at com.example.haw_app.SchnitzeljagdActivity.getCoordinatesClick(SchnitzeljagdActivity.java:109)
06-12 13:58:54.000: E/AndroidRuntime(31845):    ... 14 more
我了解到,在onCreate或onUpgrade方法中使用getReadableDatabase或GetWriteableDatabase时会出现此问题。但不幸的是,这不是我的问题

下面是一些代码:

public class SQLiteConnector extends SQLiteOpenHelper {
    public SQLiteConnector(Context context) {
        super(context, dbName, null, dbversion);

    }


    private static final String dbName = "StiSysManagerDB";
    private static final int dbversion = 2;
    private static final String[] tableName = new String[] {"Student","NextApplicationDates",TABLE_COURSES,
        "Trainings","SolvedTests","SolvedTrainings","Mailinglists"};
    private static final String[] columns = new String[] {
        "( name VARCHAR , avgGrade REAL , userName VARCHAR , password VARCHAR , matNr INT , pwExpDate VARCHAR , birthday VARCHAR , printCredit INT )",
        "( type VARCHAR , fromDate VARCHAR , toDate VARCHAR )",//NextApplicationDates
        "( name VARCHAR , type INT , prof VARCHAR , status VARCHAR )",//Courses
        "( name VARCHAR , prof VARCHAR , status VARCHAR , "+KEY_GROUP+" INT )", //registeredTrainings       
        "( name VARCHAR , grade INT )",//solvedTests
        "( name VARCHAR , status INT )", //solvedTrainings
        "( name VARCHAR , adress VARCHAR )"//mailinglists
        }; 

    @Override
    public void onCreate(SQLiteDatabase db) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i<tableName.length;i++)
        {       
            sb.delete(0, sb.length());
            sb.append("CREATE TABLE IF NOT EXISTS ").append(tableName[i]).append(" ").append(columns[i]).append(";");
            db.execSQL(sb.toString());
        }   
        String[] sary = this.getDBNames();
        for (String s : sary)
        {
            Log.d("DBNames", "s");
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int oldVersion, int newVersion) {
        if (oldVersion == 1 && newVersion >= 2)
        {
            arg0.execSQL("alter table Student add column password VARCHAR default ''");         

        }
    }

    private int saveStudent(Student std)
    {       
         ContentValues val = new ContentValues();
         val.put(Student.NAME, std.name);
         val.put(Student.AVERAGEGRADE, std.avgGrade);
         val.put(Student.USERNAME, std.userName);
         val.put(Student.MATRIKELNUMMER, std.matNr);
         DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
         val.put(Student.PASSWORD_EXP_DATE, fmt.print(std.pwExpDate));
         val.put(Student.BIRTHDAY, fmt.print(std.birthdate));
         val.put(Student.PRINTCREDIT, std.printCredit);
         val.put(Student.PASSWORD, std.pw);
         SQLiteDatabase db = this.getWritableDatabase();
         db.delete(Student.TABLENAME, null, null);
         int i = (int)(db.insert(Student.TABLENAME, null, val));
         db =  null;
         return i;

    }

    private Student getStudent()
    {
        SQLiteDatabase db = this.getReadableDatabase();
        Student std = new Student();        
        Cursor cursor = db.rawQuery("SELECT "+Student.columnList()+" FROM Student", null);
        db = null;
        if (cursor.getCount()!=0)
        {
            cursor.moveToNext();                            
            std.name = cursor.getString(cursor.getColumnIndex(Student.NAME));               
            std.avgGrade = cursor.getDouble(cursor.getColumnIndex(Student.AVERAGEGRADE));
            std.userName = cursor.getString(cursor.getColumnIndex(Student.USERNAME));
            std.matNr = cursor.getInt(cursor.getColumnIndex(Student.MATRIKELNUMMER));
            String pwExpDate = cursor.getString(cursor.getColumnIndex(Student.PASSWORD_EXP_DATE));      
            std.pwExpDate= Util.createDateTimeFromString(pwExpDate);
            String birthday = cursor.getString(cursor.getColumnIndex(Student.BIRTHDAY));
            std.birthdate= Util.createDateTimeFromString(birthday);
            std.printCredit = cursor.getInt(cursor.getColumnIndex(Student.PRINTCREDIT));
            std.pw = cursor.getString(cursor.getColumnIndex(Student.PASSWORD));     
        }else{
            saveStudent(std);
        }       
        return std;
    }
}
我做错什么了吗?哦,还有:在这个类之外,我不使用getReadableDatabase或GetWriteableDatabase


有什么提示吗?

正如stacktrace所建议的,getDBNames会引发对getReadableDatabase的调用,从而创建递归。去掉那个电话,你就会被找到。非常感谢,它成功了。看来我真的没看到那个电话:)
class Student{

    static final String NAME = "name", USERNAME = "userName", AVERAGEGRADE ="avgGrade", MATRIKELNUMMER = "matNr", 
            PASSWORD_EXP_DATE = "pwExpDate", BIRTHDAY = "birthday", PRINTCREDIT = "printCredit", PASSWORD  = "password";
    static final String TABLENAME ="Student";
    String name,userName,pw;
    double avgGrade;
    int matNr, printCredit;
    DateTime birthdate, pwExpDate;

    static String columnList()
    {
        StringBuilder sb = new StringBuilder();
        sb.append(NAME).append(", ").append(USERNAME).append(", ").append(AVERAGEGRADE).append(", ").append(MATRIKELNUMMER)
        .append(", ").append(PASSWORD_EXP_DATE).append(", ").append(BIRTHDAY).append(", ").append(PRINTCREDIT).append(", ").append(PASSWORD);
        return sb.toString();
    }

    public Student()
    {
        name = null;
        userName = null;
        avgGrade = 0;
        matNr = 0;
        printCredit = 0;
        birthdate = null;
        pwExpDate = null;
        pw = null;
    }


}