2012-07-09 86 views
1

我是Android開發新手。我的應用程序有問題。我的SQLite數據庫表 正在每個系統重新啓動時重新創建,並且所有保存的內容都從表中刪除。任何人都可以請幫我解決這個問題嗎?在每個應用程序重新啓動時重新創建SQLite數據庫表

這裏是我的數據庫類....

package Nsh.android.sms; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.SyncStateContract.Helpers; 

public class Database { 

public static final String MYDATABASENAME="Mylanguagedbnew.db"; 
public static final String MYDATABASETABLE="Mylanguagedb_table1"; 
public static final int MYDATABASEVERSION=1; 
public static final String KEY_id="_id"; 
public static final String KEY_language="languages"; 
public static final String KEY_description="languagedescription"; 
private static final String SCRIPT_CREATE_DATABASE="create table if not exists 
"+MYDATABASETABLE+" ("+KEY_id+" integer primary key autoincrement, "+KEY_language+" 
text not null, "+KEY_description+ " text not null);"; 
private datahelper sqliteopenhelper; 
public static String userselectedlang; 
private SQLiteDatabase sqlitedatabase; 
private Context context; 
public Database(Context c){ 
System.out.println("DBcontext!!!1111"); 
context=c; 
    } 
public Database openToread()throws android.database.SQLException{ 
System.out.println("DBINSERTTTTTTTTT!!!OPENREAD22222"); 
    sqliteopenhelper=new datahelper(context,MYDATABASENAME,null,MYDATABASEVERSION); 
    System.out.println("DBINSERTTTTTTTTT!!!OPENREAD22222"); 
    sqlitedatabase=sqliteopenhelper.getReadableDatabase(); 
    System.out.println("DBINSERTTTTTTTTT!!!OPENREAD22222"); 
    return this; 
    } 
    public Database openTowrite()throws android.database.SQLException{ 
System.out.println("DBINSERTTTTTTTTT!!!OPENWRITE22222"); 
sqliteopenhelper=new datahelper(context,MYDATABASENAME,null,MYDATABASEVERSION); 
sqlitedatabase=sqliteopenhelper.getWritableDatabase(); 
return this; 
    } 
public void close(){ 
sqliteopenhelper.close(); 
} 
    public Cursor retriveall(){ 
    System.out.println("RETRIEVE ALL OK!!!!!!!!!"); 
String[] columns={KEY_id,KEY_language,KEY_description}; 
Cursor cursor=sqlitedatabase.query(MYDATABASETABLE, columns,null,null,null,null,null); 
return cursor; 
    } 
    public Cursor retrivelanguages(){ 
String[] columns={KEY_language}; 
Cursor c=sqlitedatabase.query(MYDATABASETABLE, columns,null,null,null,null,null); 
return c; 
    } 
    public Cursor retrieveselectedlanguagedecription(){ 
userselectedlang=listlang.selectedlanguage; 
String query="select languagedescription from Mylanguagedb_table1 where languages 
     ='"+userselectedlang+"';"; 
Cursor c1=sqlitedatabase.rawQuery(query,null); 
return c1; 
    } 
    public long insert(String language,String languagedescription){ 
System.out.println("DBINSERTTTTTTTTT!!!INSERT !!!!!!!!!1111"); 
ContentValues contentvalues=new ContentValues(); 
contentvalues.put(KEY_language,language); 
contentvalues.put(KEY_description,languagedescription); 
return sqlitedatabase.insert(MYDATABASETABLE, null,contentvalues); 
    } 
    public int deleteall(){ 

return sqlitedatabase.delete(MYDATABASETABLE,null,null); 
    } 
    /*public int deleterow(){ 
String selectedrow=listlang.selectedlanguage; 

return sqlitedatabase.delete(MYDATABASETABLE,selectedrow, null); 
    }*/ 
    private static class datahelper extends SQLiteOpenHelper{ 

public datahelper(Context context, String name, CursorFactory factory, 
     int version) { 
    super(context, name, factory, version); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(SCRIPT_CREATE_DATABASE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    //db.update(table, values, whereClause, whereArgs) 
} 

    }  
    } 
+2

顯示代碼,一般來說,您需要在寫入之前檢查數據庫是否存在 – ibash 2012-07-09 06:23:52

+0

顯示您的代碼。所以我們可以找出你的問題。 – 2012-07-09 06:27:10

+0

你是否一直在使用相同的模擬器或新的模擬器 – 2012-07-09 06:49:39

回答

0

當應用程序啓動,將創建新的數據庫和表,如果不存在否則它將繼續退出分貝。

將此代碼置於您的應用的啓動活動的onCreate()方法來檢查數據庫是否已存在或不存在。

//this is the name of my database 
public static final String DATABASE_NAME = "mydatabase.db"; 

//this is the complete path of my database stored. you can check in DDMS 
public static final String DATABASE_PATH = "/data/data/com.rdc.mydatabase/databases/"; 

Context context = getBaseContext(); 

boolean databaseStatus = checkDataBase(DATABASE_PATH,DATABASE_NAME); 
//this will check when app start 
if (databaseStatus == false) { 

    DBAdapter database = new DBAdapter(context); 
    //here you can call your create table method 
    //database.createLoginTable(); 
    Log.v("Debug", "Login table created."); 
} 
else{ 
    Log.v("Debug", "Database already exist"); 
} 

//method to check whether db is already exist or not and returns boolean 
private boolean checkDataBase(String databasePath, String databaseName) { 
     SQLiteDatabase checkDB = null; 
     try { 
      checkDB = SQLiteDatabase.openDatabase(databasePath + databaseName, 
        null, SQLiteDatabase.OPEN_READONLY); 
      checkDB.close(); 
      Log.v("Debug", "Database exist"); 
      return true; 
     } catch (SQLiteException e) { 
      Log.v("Debug", "Database not exist"); 

     } 
     return false; 
    } 

我希望它能幫助你!

+0

非常感謝您的文章.....但我的數據庫存儲數據我可以訪問記錄。但是當我關機我的系統中的所有記錄都是空的,Iam再次插入爲什麼會發生這種情況?....我的數據庫可以看到模擬器何時開始運行......問題出在系統重新啓動時。 – user1498512 2012-07-09 08:33:29

+0

我想知道閱讀「當我關閉我的系統所有記錄變空」..正如我可以說,如果你正在使用模擬器測試然後 - >重新啓動Em後,你可以再次看到數據庫文件,當模擬器安裝在DDMS ,一旦創建數據庫永遠不會刪除,直到我們卸載應用程序或手動刪除數據庫文件,我可以知道你的dbadapter代碼是怎麼樣的? – swiftBoy 2012-07-09 09:20:13

+0

上面我添加了我的數據庫代碼....可以檢查我的錯誤...我真的很感激.. – user1498512 2012-07-09 09:49:19

0

您可以通過在onCreate()方法中使用SharedPreferences方法解決此問題,您可以限制只在應用程序第一次執行時插入數據(如果它是固定數據)。這將解決重複問題。

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 

     SharedPreferences pref = getSharedPreferences(PREFS_NAME1,MODE_PRIVATE); 
     boolean first1 = pref.getBoolean(PREF_FIRST1, false); 

     if(first1!=true) 
     { 
      getSharedPreferences(PREFS_NAME1,MODE_PRIVATE) 
      .edit() 
      .putBoolean(PREF_FIRST1, true) 
      .commit(); 

      // insert data here or use Background Task to do that 
     } 

    } 
相關問題