- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有人能解释一下如何在 SqliteDbOpenHelper 类中调用 onUpgrade 函数吗?我正在打开我的数据库,但它没有调用 onUpgrade,即使我已经更改了 DB_VERSION。
见以下代码:
public class DbHelper extends SQLiteOpenHelper {
private static final String TAG = "DbHelper";
static final String DB_NAME = "caddata.sqlite";
static final int DB_VERSION = 4;
private static String DB_PATH = "";
private Context myContext;
private SQLiteDatabase myDataBase;
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
DB_PATH = "/data/data/"
+ context.getApplicationContext().getPackageName()
+ "/databases/";
}
public DbHelper open() throws SQLException {
myDataBase = getWritableDatabase();
Log.d(TAG, "DbHelper Opening Version: " + this.myDataBase.getVersion());
return this;
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "onCreate called");
try {
createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if ( newVersion > oldVersion)
{
Log.d(TAG, "New database version exists for upgrade.");
try {
Log.d(TAG, "Copying database...");
copyDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (!dbExist) {
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
openDataBaseForRead();
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY
| SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Log.d(TAG, "db exists");
} catch (SQLiteException e) {
// database does't exist yet.
Log.d(TAG, "db doesn't exist");
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
// Open your local db as the input stream
InputStream myInput = myContext.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[2048];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
myDataBase.setVersion(DB_VERSION);
}
public void openDataBaseForRead() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
public void openDataBaseForWrite() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS );
}
}
另请参阅此处详细说明我的问题:Why is onUpgrade() not being invoked on Android sqlite database?我没有得到回复。
我的主要 Activity 从助手打开数据库。我假设只要打开数据库就会调用 onUpgrade() 函数:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DbHelper myDbHelper = new DbHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBaseForRead();
}catch(SQLException sqle){
throw sqle;
}
}
最佳答案
在我看来,onCreate()
和 onUpgrade()
函数仅在您使用 SQLiteOpenHelper
打开数据库时起作用
。这意味着你应该调用函数getWritableDatabase()
或getReadbleDatabase()
来打开数据库,然后它也许可以正常工作。
关于android - 是什么触发了 SqliteDbOpenHelper onUpgrade()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7661376/
我正在尝试通过向我的 android 应用程序中的 Sqlite 表添加一列来升级某个表。我在我的 DBHelper 的 onUpgrade 方法中添加了一个 alter table 语句。 这是我遇
我正在尝试调用 onUpgrade() 来更新我的包含几列的表格。然而,当我运行该应用程序时,我在插入语句中收到一条错误消息,指出该表中不存在列(我尝试在 onUpgrade() 中添加的列)。非常感
我对 onUpgrade 有点困惑。我正在开发我的应用程序,在开发过程中我确实更改了 DATABASE_VERSION 五次,所以现在是 6。 一切都很顺利,直到我从手机上完全卸载应用程序并重新构建它
我是 Android 和数据库的新手,我在 DatabaseIncomeOutcome.java 类中有这个方法: public DbHelper(Context context) {
我在 android 中的 SQLite 数据库中遇到问题。 在 SQLiteOpenHelper 类的 onCreate(SQLiteDatabase db) 方法中,我正在创建表。现在我在 Pla
我正在尝试更新我的 Android 应用程序中的数据库。当我更新版本号时,会调用 onUpgrade,但版本号不会增加,因此每次访问数据库时都会调用 onUpgrade。这是我的代码: private
我正在开发我的应用程序的第二个版本。我遇到了一个问题。 在我的应用程序中,数据库位于 Assets 文件夹中。现在我想从第二个版本的 Assets 文件夹更新我的数据库。 我尝试将代码升级为: //
我已经使用 onUpgrade() 添加了一个表,现在我刚刚意识到需要添加另一个表。我希望在不丢失任何以前的数据或表格的情况下执行此操作。 我尝试从 onUpgrade 中删除所有内容以添加新表,但它
我正在使用预填充的数据库。在 Mozilla 中使用 SQLite Manager,现在我有一个虚拟数据库,只是想测试 onUpgrade 方法,因此我更改了其中一列中的字符串,将其导出为新数据库,正
您可以在下面看到我的数据库助手类。我使用在 Assets 文件夹中导入的预填充 SQLite 数据库。每当我向现有数据库添加表时,如果我的应用程序已安装在手机上,则不会出现此类表错误。我想我的 onU
我在表格中添加了一列 (SUM)。我认为重写/重新创建表所需要做的就是为 DATABASE_VERSION 创建变量,但这不起作用。我的 onUpgrade() 方法中需要一些东西吗? 版本变量: p
您好,我目前正在开发一款语言词典应用。该数据库来 self 手动输入的 SQLite 数据库。该应用程序的特点是用户可以要求添加任何不在列表中的单词,因此每次更新应用程序时我都必须手动更新数据库。 问
情况是这样的。我正在升级我的数据库,添加一个列。升级似乎很顺利。我可以看到添加了新列,但问题是当我的应用程序从旧版本升级到带有新数据库的新版本时,我强制关闭了。访问新列时似乎发生强制关闭。但是,如果我
我的 onUpgrade 函数有一个小问题。代码如下: @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int n
我的 Android 应用程序中有一个只读数据库,我会定期更新该数据库。该应用始终在其 Assets 中携带最新版本的数据库。 我增加了传递给 SQLiteOpenHelper 子类的构造函数的版本号
在我的应用程序中,我有一个数据库,它是使用 DBHelper 类中的数据库查询创建的。我希望 onUpgrade 语句在安装 apk 时运行,因为用户可能会卸载并安装相同的应用程序。 在这种情况下,它
在我的 dbHelper 中: onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 函数我将一张表保存到外部数据库。 所以我 附加
我正在尝试将我的数据库从版本 1 升级到版本 2。我正在分配 DATABASE_VERSION = 2(也分配了第一个版本)但从未调用过 onUpgrade .可能代码中有明显的错误,但我看不到它,因
在我的 Android 项目中,我有一个使用了一段时间的表。现在我想删除一列“image_byte”并添加一个新列“image_path”。我不能只是在使用应用程序时重命名该列,并且需要删除 imag
有人能解释一下如何在 SqliteDbOpenHelper 类中调用 onUpgrade 函数吗?我正在打开我的数据库,但它没有调用 onUpgrade,即使我已经更改了 DB_VERSION。 见以
我是一名优秀的程序员,十分优秀!