【问题标题】:How to insert data into the database file which is in the assets folder如何将数据插入到资产文件夹中的数据库文件中
【发布时间】:2012-01-02 11:29:16
【问题描述】:

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

谁能告诉我如何将值存储到数据库文件中。我需要存储用户名和分数。把它想象成字符串,请给我一个例子。

【问题讨论】:

    标签: android database sqlite insert


    【解决方案1】:

    您不应该在 assets 文件夹中创建数据库,因为我们只能从 assets 文件夹中读取数据。

    事实上,你应该在默认的内部文件夹中创建数据库,即 data/data/[package-name]/databases 或者你也可以在 sdcard 中创建数据库并执行读写操作但是如果没有sdcard当然不会运行。

    以下是在sdcard中创建databse的代码:-

        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();
            }
        }
    

    【讨论】:

      【解决方案2】:

      由于/asset 目录是只读(因为 android .apk 文件是只读的)所以你不能在资产文件夹文件中写入任何内容,你必须先复制那个 sqlite 数据库文件到你的应用程序的内部存储/data/data/&lt;package_name&gt;/databases目录然后你可以修改你的数据库文件..

      1. 将您预填充的 sqlite 数据库文件复制到 data/data/&lt;package_name&gt;/databases directory

      2. 在您的 sqlite 数据库助手类中打开该数据库文件(从 /databases/ 目录)..

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

      【讨论】:

      • 朋友们,我这样做了,我从那个文件中读取数据到我的应用程序中。但是我在写入这个文件时遇到了问题。请给我任何插入技术来插入这个文件。我已经编写了从这个文件读取的代码。读取没有问题,只需要插入。
      • 是的,然后在获取用户名和分数后需要将其显示到列表视图中。所以我想将数据插入到数据库文件中,然后将其显示到列表视图中。跨度>
      【解决方案3】:

      您需要从资产中复制数据库文件并粘贴到 /data/data/''/databases/ 文件夹中

      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 ] 替换为您的包名。

      【讨论】:

      • 我有这段代码,我知道如何从谷歌搜索中读取它。但我不知道如何插入到这种类型的文件中。需要插入代码这个给定示例的操作。我只想将用户名和分数放入数据库文件
      猜你喜欢
      • 2014-01-02
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2013-07-14
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多