如何为自动呼叫记录器应用程序更改结构数据库而不会丢失数据?

时间:2017-08-29 21:13:01

标签: android sqlite

我的应用程序使用服务记录每个来电和去电。

此服务在断开调用后存储文件,然后在SQLite数据库中创建一行。

然后我在MainActivity中使用此数据,使用ListView填充SimpleCursorAdapter

我遇到的问题是,如果我对SQlite数据库进行结构更改(例如添加新列),我需要更新版本,然后导致onUpgrade删除表,从而删除所有数据。因此,没有ListView个项目。

如果我通过列出目录中的文件填充我的ListView,我将无法确定通话时间。

2 个答案:

答案 0 :(得分:0)

当您需要维护大量复杂的关系数据并且必须对该数据执行查找时,

SQlite数据库是很好的。

对于您的应用,您可以使用更简单的内容,即SharedPreferences文件。

您可以使用简单的JSON对象,例如:

{
    path : path_value,
    date : date_value,
    duration : duration_value,
    .....
}

创建一个JSON个对象数组,将其转换为字符串并将其保存到SharedPreferences

由于SharedPreferences更简单,因此您无法使用它,因此在更新应用时您不必修改它。

注意:当您显示每个文件时,您可能还想使用path来检查它是否真的存在。

答案 1 :(得分:0)

  

问题是,如果我在sqlite数据库中进行更改,我需要更新   版本,然后所有listview项目都消失了,因为数据库有   已更新,但录制的文件存储在应用程序数据目录中。

(编辑问题后)

  

我遇到的问题是,如果我对SQlite进行结构更改   数据库(例如添加新列),我需要更新版本,   然后导致onUpgrade删除表,从而导致所有   数据。因此,没有ListView项目。

您实际上不必更新版本(如果您愿意,可以使用自己的方法)。但是,即使您这样做,也可以使用代码来保留旧数据。也就是说,你不一定限于使用那些看得多,复制得多的 DROP TABLE调用onCreate 模型,例如: -

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
    onCreate(db);
}

您可以使用 ALTER TABLE 添加列,例如

ALTER TABLE log ADD COLUMN extra TEXT DEFAULT extra ;

使用上述结果导致: -

enter image description here 在添加了列额外的情况下,注意到已应用默认值并且保留了现有数据(未使用PS增加版本/ onUpgrade)。

这篇文章简要讨论了 DROP TABLE调用onCreate 模型,其中包含其他指针Android SQLite Database, WHY drop table and recreate on upgrade