我有一个依赖于SQLite的应用程序,数据由资源文件夹中的应用程序随附的xmls填充.
现在我意识到,当我必须在Google Play上推送更新并在XML中添加更多内容时.即使我将数据库版本从1更改为2.导入脚本也不会运行,因为共享首选项config_run值将设置为true.
有关如何处理这种情况的任何指示?
方案
我的应用流程
第二个案例
正如以下几个人所建议的那样,如果我尝试在SQLiteHelper的onUpgrade中将数据变为数据库,那么它将仅在MAinActivity中发生,因为我在SplashActivity中不打开Db连接并且也不会显示Dialog Progress.
我是Android上的新手.我在数据库中的insert语句有些问题,当我运行应用程序时,尚未插入值.请有人帮忙..
public class DatabaseAdapter extends SQLiteOpenHelper {
// Database attributes
public static final String DB_NAME = "MoneyManagerSystemTr";
public static final int DB_VERSION = 1;
// Table attributes
public static final String TABLE_ACCOUNT = "account_table";
//Account Table
public static final String KEY_BANKNAME ="bankname";
public static final String KEY_TYPE = "type";
public static final String KEY_ACCNUM = "accnum";
public static final String KEY_BALANCE = "balance";
public static final String KEY_EXPIRYDATE = "expirydate";
@Override
public void onCreate(SQLiteDatabase db) {
String AccountTable = "create …Run Code Online (Sandbox Code Playgroud) 我正在编写一个任务列表并拥有Project对象,它包含所有任务(和元数据).我使用操作日志,因此当任务更改时我不会立即将其保存到数据库,只需将其保存在内存中以在活动结束时转储到数据库中.Activity的onDestroy方法是最好的地方:如果没有调用onRetainNonConfigurationInstance方法,我启动服务来保存项目(一个实例存储在Application中).节省成本:在DB项目中有修改,所以我保存新数据,更改当前版本并删除以前版本的数据.所以我不害怕突然申请停止.
但是,根据我必须的文件do not count on this method being called as a place for saving data.
有没有其他地方可以保存我的数据?
我在我的数据库中添加了名为"MEDIA_TABLE"的表,我收到以下错误代码:
05-15 20:56:22.976: E/AndroidRuntime(5968): android.database.sqlite.SQLiteException: table personal_stats already exists (code 1): , while compiling: CREATE TABLE personal_stats (_id INTEGER PRIMARY KEY AUTOINCREMENT, pictures TEXT, videos TEXT);
Run Code Online (Sandbox Code Playgroud)
我的第二张桌很好用.
我试图卸载我的应用程序并安装它,它不会工作,也许在DB中有一个表的限制?
这是我的onCreate代码:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_DATE + " TEXT, " +
COLUMN_EXERCISE + " TEXT, " +
COLUMN_WEIGHT + " TEXT, " +
COLUMN_REPS + " TEXT, " +
COLUMN_SET_TIME + " …Run Code Online (Sandbox Code Playgroud) 目前,我有一个帖子表和一个用户表.当然,每个用户可以与多个帖子相关联.post表中的每一行都存储创建帖子的用户的用户ID.以下是示例行:
发布行:post_id标题user_id
用户行:user_id user_name
我想通过将post表中的用户ID与user表中的用户ID匹配来返回包含post行及其相应用户行的Cursor.我将使用什么类型的查询来实现此目的?结果应该是:
合并行:post_id标题user_id user_name
更一般地说:如何将基于共享数据的两个独立表中的数据组合到一个Cursor中?
我打算GreenDAO在我的项目中使用.我已经通过创建测试项目来测试它.但是,我有几个要求,我需要完成.
我的应用程序的数据库将被加密.为此,我们计划使用SQLCipher.我找到了这个链接.我正在研究它,但有兴趣知道原始的GreenDAO项目有什么可用.
由于我的应用程序将数据与服务器同步,我将使用SyncAdapter,因为我不想自己完成所有的重量级操作,这已经由Android框架完成.但它需要Content Provider合作.那么,我如何使用GreenDAO Content Provider.
更新2
我的项目有七个实体.我用过addContentProvider()实体.并生成七个不同的内容提供商.有没有办法在单个内容提供商中拥有所有sqlite表?
该应用程序包含SQLite数据库中的数据.UI主要是RecyclerView.问题是如何最好地将数据从数据库传输到UI,同时避开主线程?
我原计划使用CursorLoader,ContentProvider和RecyclerView.但阅读它看起来像RecyclerView没有对Cursor提供的数据的开箱即用支持.荡.
那给我留下了一些其他选择......
AsyncTask加载数据,将其放入模型对象,并传递到RecyclerView适配器.除了丑陋之外,它不是配置改变友好的.
一个自定义Loader,它从SQL加载数据并将其推送到模型对象中.
使用Cursor加载器,当它返回Cursor迭代它时将数据推送到模型对象.我怀疑这会发生在主线程上,可能会损害性能.
使用Otto发送请求数据的请求消息,然后通过返回消息返回模型对象集合.可能有大约500个物体,所以我想我可能宁愿滥用奥托这样做.
如果我使用的是模型对象的集合而不是Cursor我看到ContentProvider的好处较少,而且我也失去了UI在数据更改时自动刷新的能力(这可能很有用).
这些选项都没有吸引力,有没有更好的方法?该应用程序在时间压力下,所以无论它需要相当快速实施.不幸的是,UI需要水平滚动并且只针对Lollipop,所以RecyclerView似乎比ListView更好.
android android-contentprovider android-cursorloader android-sqlite android-recyclerview
我试图在我的Android应用程序中执行以下查询:
private static final String[] PROJECTION =
{
Data.CONTACT_ID, Data.MIMETYPE,
Data.DISPLAY_NAME, Phone.NUMBER,
Phone.TYPE, StructuredName.GIVEN_NAME,
StructuredName.MIDDLE_NAME,
StructuredName.FAMILY_NAME,
Data.DELETED
};
private static final String SELECTION = "(" + Data.MIMETYPE + " = ? AND "
+ Phone.TYPE + " IN (?,?,?)) OR ("
+ Data.MIMETYPE + " IN (?))";
private static final String[] SELECTION_ARGS =
{
Phone.CONTENT_ITEM_TYPE,
String.valueOf(Phone.TYPE_MOBILE),
String.valueOf(Phone.TYPE_HOME),
String.valueOf(Phone.TYPE_WORK),
StructuredName.CONTENT_ITEM_TYPE
};
final Cursor cursor = mContext.getContentResolver().query(
Data.CONTENT_URI, PROJECTION, SELECTION, SELECTION_ARGS, Data.CONTACT_ID);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
04-29 11:00:58.715 8588 15565 E DatabaseUtils: Writing exception to …Run Code Online (Sandbox Code Playgroud) 我通过提供从3到4的迁移将数据库从版本3升级到版本4。
这是我的迁移代码:
private static Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE caption_table ADD COLUMN localVideoUrl TEXT;");
database.execSQL("ALTER TABLE caption_table ADD COLUMN postType TEXT");
database.execSQL("ALTER TABLE caption_table ADD COLUMN videoUrl TEXT");
}
};
Run Code Online (Sandbox Code Playgroud)
这是创建会议室数据库的代码
this.mAppDataBase = Room.databaseBuilder(getApplicationContext(), AppDataBase.class, "my_db")
.addMigrations(MIGRATION_2_3, MIGRATION_3_4)
.build();
Run Code Online (Sandbox Code Playgroud)
这是我在PostModel上添加的代码
@Expose
private String postType;
@Expose
private String videoUrl;
@Expose
private String localVideoUrl;
public String getPostType() {
return postType;
}
public void setPostType(String postType) {
this.postType = postType;
}
public …Run Code Online (Sandbox Code Playgroud) 使用Room AutoMigrations时,它Migration本身会自动生成。但为了对迁移进行单元测试,我必须将一个Migration对象传递给runMigrationsAndValidate. 我应该在这里传递什么?
@RunWith(AndroidJUnit4::class)
class MigrationTest {
private val TEST_DB = "migration-test"
@Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
MigrationDb::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory()
)
@Test
@Throws(IOException::class)
fun migrate1To2() {
var db = helper.createDatabase(TEST_DB, 1).apply {
// db has schema version 1. insert some data using SQL queries.
execSQL(...)
// Prepare for the next version.
close()
}
// Re-open the database with version 2 and provide
// Migration as the migration process.
db …Run Code Online (Sandbox Code Playgroud) android-sqlite ×10
android ×9
sqlite ×4
android-room ×2
database ×1
greendao ×1
insert ×1
java ×1
ondestroy ×1
orm ×1