2012-08-28 17 views
0

新Android開發和Java兩種,試圖分開我查詢到的查詢/命令文件,從數據庫繼承管理QueryBase.java文件。當我運行我的應用程序出現以下錯誤: 「關於調用堆棧溢出Landroid /數據庫/源碼/ SQLiteOpenHelper ;. <init>:VLLLI」

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) 

我從來沒有真正運行前到堆棧溢出錯誤!我不確定如何糾正這個問題。我有一個獨立的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) { 

} 
} 

線18 QueryBase是這樣的:

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

回答

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 ...

+0

啊我完全錯過了,在構造函數中創建一個新的實例。謝謝,會放棄它! – Kiada

+0

將在9分鐘內接受答覆,工作正常:)謝謝! – Kiada