写入现有数据库不会插入值

时间:2014-03-27 15:26:55

标签: android database sqlite

我正在关注URL以设置我的应用程序,最初使用apk,我将提供一个数据库,稍后我将更新数据库表。

Link

我可以轻松地将数据库放到资产文件夹中,然后将该数据库复制到工作目录,但每当我尝试使用

将值放入其中时
ContentValues values = new ContentValues();
values.put("id", 16);           
values.put("name", "satya");
values.put("state", "hello");
sampleDB.insert("list", null, values);

使用以下代码在 OPEN_READWRITE 模式下打开数据库。

sampleDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

尝试插入时也没有例外。请告诉我。

注意:现在它显示SQLiteDatabase抛出SQLiteReadOnlyDatabaseException,我已经读过我们无法更改资产中导出的数据库表值。这是真的吗?

1 个答案:

答案 0 :(得分:-1)

你在哪里复制?在默认情况下,Android在/ data / data / [your_package_name] / databases文件夹中创建数据库。尝试复制那里。

修改

尝试将其打包到SQLiteOpenHelper类,如下所示:

public class DataBaseHelper extends SQLiteOpenHelper {


  // The Android's default system path of your application database.
  private static String DB_PATH = "/data/data/com.example.testdatabasecopy/databases/";

  private static String DB_NAME = "mydatabase.sqlite";

  private SQLiteDatabase myDataBase;

  private Context mContext;

  public DataBaseHelper(Context context) {
    super(context, DB_NAME, null, 1);
    if (android.os.Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
      DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    } else {
      DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    }
    this.mContext = context;
  }


  /**
   * Creates a empty database on the system and rewrites it with your own database.
   * */
  public void createDataBase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
      // do nothing - database already exist
    } else {

      // By calling this method and empty database will be created into the default system path
      // of your application so we are gonna be able to overwrite that database with our database.
      this.getReadableDatabase();

      try {
        copyDataBase();
      } catch (IOException e) {
        throw new Error("Error copying database");
      }
    }
  }

  /**
   * Check if the database already exist to avoid re-copying the file each time you open the application.
   * 
   * @return true if it exists, false if it doesn't
   */
  private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
      String myPath = DB_PATH + DB_NAME;
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    } catch (Exception e) {
      e.printStackTrace();
      // database does't exist yet.
    }

    if (checkDB != null) {
      checkDB.close();
    }

    return checkDB != null ? true : false;
  }

  /**
   * Copies your database from your local assets-folder to the just created empty database in the system folder, from where it can be accessed and handled. This is done by
   * transfering bytestream.
   * */
  private void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = mContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
      myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

  }

  public void openDataBase() throws SQLException {

    // Open the database
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

  }

  @Override
  public synchronized void close() {

    if (myDataBase != null)
      myDataBase.close();

    super.close();

  }

  @Override
  public void onCreate(SQLiteDatabase db) {

  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  }

  // Add your public helper methods to access and get content from the database.
  // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
  // to you to create adapters for your views.



}

然后:

DataBaseHelper myDbHelper = new DataBaseHelper(this);
myDbHelper = new DataBaseHelper(this);

try {
  myDbHelper.createDataBase();
} catch (IOException ioe) {
  throw new Error("Unable to create database");
}

try {
  myDbHelper.openDataBase();
} catch (SQLException sqle) {
  throw sqle;
}