2012-07-09 37 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 
     } 

    } 
相关问题