我创建了一个SQLite文件并将其放在assets文件夹中。现在我能够从该文件中读取数据,但我不知道如何写入此数据库文件。我需要获取用户名和分数并将其存储到该数据库文件中。我在网上搜索了SO,但也有正常数据库插入的例子。
任何人都可以告诉我如何将值存储到数据库文件中。我需要存储用户名和分数。试着把它想成一个字符串,请给我一个例子吧。
答案 0 :(得分:5)
您不应该在assets文件夹中创建数据库,因为我们只能从assets文件夹中读取数据。
实际上你应该在默认的内部文件夹中创建数据库,即 data / data / [package-name] / databases ,或者你也可以在sdcard中创建数据库并执行读写操作但是如果没有SD卡,它当然不会运行。
以下是在SD卡中创建数据库的代码: -
private SQLiteDatabase db;
private static Context cntxt;
public static File filename = null;
public static String DATABASE_FILE_PATH_EXTERNAL = null;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null,1);
cntxt = context;
try{
try{
filename = Environment.getExternalStorageDirectory();
}catch(Exception e){
Toast.makeText(DbHelper.cntxt, "Please Insert SD card To create Database", Toast.LENGTH_LONG).show();
Log.e("Log",e.getMessage(),e.fillInStackTrace());
}
DATABASE_FILE_PATH_EXTERNAL = filename.getAbsolutePath()+File.separator+DATABASE_NAME;
// db = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH_EXTERNAL, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY);
}catch(Exception e){
Log.e("Log",e.getMessage(),e.fillInStackTrace());
}
}
@Override
public synchronized SQLiteDatabase getWritableDatabase() {
// TODO Auto-generated method stub
try{
db = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH_EXTERNAL, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY);
try{
onCreate(db);
}catch(Exception e){
Log.e("Log",e.getMessage(),e.fillInStackTrace());
}
return db;
}catch(Exception e){
Log.e("Log",e.getMessage(),e.fillInStackTrace());
if(db!=null)
db.close();
}
return db;
}// End of getWritableDatabase()
**Inserting and Retrieving data from database:-**
public void insertIntoTable(String[] userName,int[] score)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
try {
db.beginTransaction();
for (int i = 0; i < beatID.length; i++) {
cv.put("UserName",userName[i]);
cv.put("Score",score[i]);
db.insert("TableName", "UserName",
cv);
}
db.setTransactionSuccessful();
} catch (Exception ex) {
} finally {
db.endTransaction();
db.close();
}
}
public void getUserNamePswd(){
Cursor c = null;
SQLiteDatabase db = null;
try{
db = this.getReadableDatabase();
c = db.rawQuery("Select UserName,Score from TableName",null);
c.moveToFirst();
String[] username = new String[c.getCount()];
int[] score = new int[c.getCount()];
int counter = 0;
c.moveToFirst();
while(!c.isAfterLast()){
username[counter] = c.getString(0);
score[counter] = c.getInt(1);
c.moveToNext();
counter++;
}
}catch(Exception e){
Log.e("Log", e.getMessage(), e.fillInStackTrace());
return null;
}finally{
c.close();
db.close();
}
}
答案 1 :(得分:1)
由于/asset
目录是只读(因为android .apk文件是只读的)所以你不能在资产文件夹文件中写任何东西,你必须先将该sqlite数据库文件复制到您的应用程序的内部存储/data/data/<package_name>/databases
目录中,然后您可以修改您的数据库文件..
将预先填充的sqlite数据库文件复制到data/data/<package_name>/databases directory
,
在sqlite数据库帮助程序类中打开该数据库文件(来自/ databases /目录)。
对该数据库执行插入,更新或选择操作..
答案 2 :(得分:1)
您需要从资产中复制数据库文件并粘贴到/ data / data /''/ databases / folder
private static String DB_NAME = "QuotesData.db";
private static String DB_PATH = "/data/data/[PACKAGE NAME]/databases/";
private void copyDataBase() throws IOException {
InputStream myInput = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
在上面的代码中:将[PACKAGE NAME]替换为您的包裹名称 我希望上面的代码能有所帮助。
谢谢