2011-05-11 110 views
0

我正在使用DatabaseHelper類來加載SQLite數據庫。如果它不存在,它會創建它。用於創建數據庫的XML文件位於SD卡上的特定文件夾中。刷新SQL數據庫

我想通過菜單從XML文件中重新安裝sql數據庫。我有菜單設置,但似乎無法找到重新加載SQL的方式。有沒有簡單的方法來做到這一點,而無需卸載應用程序,並重新安裝刪除/重新創建數據庫。

下面是從我DatabaseHelper代碼:

package samples.myApp; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.widget.Toast; 

public class DatabaseHelper extends SQLiteOpenHelper { 

    public static final String DATABASE_NAME = "projectDocuments"; 

    protected Context context; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
     this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String s; 
     try { 
      Toast.makeText(context, "Database Created", 2000).show(); 
      // Old database loaded from res 
      //InputStream in = context.getResources().openRawResource(R.raw.sql); 
      // Load from sdcard 
      InputStream in = new FileInputStream("/sdcard/ContractHound/sql.xml"); 

      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      Document doc = builder.parse(in, null); 
      NodeList statements = doc.getElementsByTagName("statement"); 
      for (int i=0; i<statements.getLength(); i++) { 
       s = statements.item(i).getChildNodes().item(0).getNodeValue(); 
       db.execSQL(s); 
      } 
     } catch (Throwable t) { 
      Toast.makeText(context, t.toString(), 90000).show(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS documents"); 
     onCreate(db); 
    } 
} 
+0

也許如果你叫活動再次比這也是可能的。 – 2011-05-11 10:07:27

+0

由於數據庫幫助程序發現數據庫已存在,所以不起作用。 – mikeciz 2011-05-13 09:19:48

回答

0

你的意思是你要調用onUpgrade?如果是這樣,你可以在構造函數中

super(context, DATABASE_NAME, null, 2); 

或編程

getWritableDatabase().setVersion(2); 

編輯

DatabaseHelper dbHelper = new DatabaseHelper(); 
SQLiteDatabase db = dbHelper.getWritableDatabase(); 
db.setVersion(db.getVersion()+1); 

類似的東西增加分貝版本。然而,我從來沒有增加數據庫版本,而不是硬編碼。
並且不要忘記在onStop或其他地方通過調用db.close()dbHelper.close()關閉您的db
也有方法needUpgrade (int newVersion)沒有javadoc,你可以嘗試玩它。

+0

ernazm,我認爲onUpgrade可以工作,但是那些硬編碼的版本號。我假設我可以使用getVersion,然後只增加一個,對吧?如何正確調用getWritableDatabase()。setVersion(2);從我的單獨的類(這是我的第一個Java程序)? – mikeciz 2011-05-13 09:17:01

+0

我編輯了我的答案 – ernazm 2011-05-13 14:29:57

+0

我仍然無法得到這個工作。我不知道我做錯了什麼。創建一個onStop函數並放入一個db.close();該程序返回到該活動時崩潰。我需要添加一些東西到onResume()爲了打開數據庫備份? – mikeciz 2011-05-17 15:25:12