0

Android開発とJavaの両方で初めて、QueryBase.javaファイルを管理するデータベースから継承するクエリ/コマンドファイルにクエリを分割しようとしています。アプリケーションを実行すると、次のエラーが発生します。

08-28 09:31:02.266: I/dalvikvm(536): threadid=1: stack overflow on call to Landroid/database/sqlite/SQLiteOpenHelper;.<init>:VLLLI
08-28 09:31:02.266: I/dalvikvm(536): method requires 32+20+8=60 bytes, fp is 0x432d1318 (24 left)
08-28 09:31:02.266: I/dalvikvm(536): expanding stack end (0x432d1300 to 0x432d1000)
08-28 09:31:02.266: I/dalvikvm(536): Shrank stack (to 0x432d1300, curFrame is 0x432d3eb8)
08-28 09:31:02.266: D/AndroidRuntime(536): Shutting down VM
08-28 09:31:02.266: W/dalvikvm(536): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-28 09:31:02.356: D/dalvikvm(536): GC_FOR_MALLOC freed 4131 objects / 329392 bytes in 47ms
08-28 09:31:02.366: E/AndroidRuntime(536): FATAL EXCEPTION: main
08-28 09:31:02.366: E/AndroidRuntime(536): java.lang.StackOverflowError
08-28 09:31:02.366: E/AndroidRuntime(536): at com.childsoft.icantalk.queries.QueryBase.<init>(QueryBase.java:18)

私はこれまで実際にスタックオーバーフローエラーに遭遇したことはありません!このhrrrmを修正する方法がわかりません。データベースを生成する別のSchemaHelperがあります-正常に動作しています。私のQueryBase.javaは次のようになります。

public class QueryBase extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "icantalk.db";
private static final int DATABASE_VERSION = 1;

protected SQLiteDatabase sqdb;
protected QueryBase sqh;

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

    this.sqh = new QueryBase(context);
    this.sqdb = sqh.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {           
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

QueryBaseの18行目は次のとおりです。

super(context, DATABASE_NAME, null, DATABASE_VERSION);

QueryBaseから継承するコマンドファイルの例は次のようになります。

public class ChildCommands extends QueryBase  {

public ChildCommands(Context context) {
    super(context);     
}

public long addChild(String name)
{
    ContentValues cv = new ContentValues();     
    cv.put(ChildrenTable.NAME, name);       
    SQLiteDatabase sd = super.getWritableDatabase();        
    long result = sd.insert(ChildrenTable.TABLE_NAME, ChildrenTable.NAME, cv);

    return result;
}   
}

また、このメソッドの呼び出し例は次のようになります。

private ChildCommands command;
.....

this.command = new ChildCommands(this);
command.addChild(childsNameValue);
4

1 に答える 1

2
public QueryBase(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION);  

    this.sqh = new QueryBase(context);
    this.sqdb = sqh.getWritableDatabase();
}

これにより、QueryBaseの新しいオブジェクトを作成しながら、QueryBaseの新しいオブジェクトを作成することになります。これは終わりのない呼び出しです。

これを使って:

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

    this.sqh = this;
    this.sqdb = sqh.getWritableDatabase();
}

編集:sqhこの変数には(静的ではない!)配置されているのと同じインスタンスが含まれているため、ところでは必要ありませんsqh == this...

于 2012-08-28T09:54:16.523 に答える