如何将数据插入assets文件夹中的数据库文件

时间:2012-01-02 11:29:17

标签: android database sqlite insert

我创建了一个SQLite文件并将其放在assets文件夹中。现在我能够从该文件中读取数据,但我不知道如何写入此数据库文件。我需要获取用户名和分数并将其存储到该数据库文件中。我在网上搜索了SO,但也有正常数据库插入的例子。

任何人都可以告诉我如何将值存储到数据库文件中。我需要存储用户名和分数。试着把它想成一个字符串,请给我一个例子吧。

3 个答案:

答案 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目录中,然后您可以修改您的数据库文件..

  1. 将预先填充的sqlite数据库文件复制到data/data/<package_name>/databases directory

  2. 在sqlite数据库帮助程序类中打开该数据库文件(来自/ databases /目录)。

  3. 对该数据库执行插入,更新或选择操作..

答案 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]替换为您的包裹名称 我希望上面的代码能有所帮助。

谢谢