标签: android-database

使用数据库发送应用程序

如果您的应用程序需要数据库并且它带有内置数据,那么运送该应用程序的最佳方式是什么?我是不是该:

  1. 预先创建SQLite数据库并将其包含在.apk

  2. 在应用程序中包含SQL命令并让它创建数据库并在首次使用时插入数据?

我看到的缺点是:

  1. 可能的SQLite版本不匹配可能会导致问题,我目前不知道数据库应该去哪里以及如何访问它.

  2. 在设备上创建和填充数据库可能需要很长时间.

有什么建议?关于任何问题的文档的指针将不胜感激.

android android-sqlite android-database

948
推荐指数
9
解决办法
23万
查看次数

房间无法验证数据的完整性

使用Room Database运行程序时出现此错误

Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. 
You can simply fix this by increasing the version number.
Run Code Online (Sandbox Code Playgroud)

我们似乎需要更新数据库版本,但是我们可以在Room中从哪里做到这一点?

android android-database android-room

56
推荐指数
10
解决办法
3万
查看次数

卸载Android应用程序时,数据库不会删除

我有两个主要问题.

  1. 卸载应用程序时,数据库不会删除.
  2. 在应用程序不稳定时,下载的文件不会被删除.

我的android应用程序中有一个数据库.我用java创建它

class as follows.

public DataBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
    super(context, name, factory, version, errorHandler);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // creating required tables
    db.execSQL(CREATE_TABLE_QUOTES);
    db.execSQL(CREATE_TABLE_FILTERS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUOTES);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUOTES);
    // create new …
Run Code Online (Sandbox Code Playgroud)

sqlite android android-file android-sqlite android-database

44
推荐指数
5
解决办法
2万
查看次数

Firebase权限被拒绝错误

我是firebase的初学者,并试图从我的数据库中获取价值.

但它每次都显示我同样的错误.

    W/SyncTree: Listen at /child failed: FirebaseError: Permission denied
Run Code Online (Sandbox Code Playgroud)

我的火力基地规则

    {
  "Condition" : "sunny",
  "child" : 5
}
Run Code Online (Sandbox Code Playgroud)

我的Androidmanifest.xml

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mohit.firebase" >

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

我的mainactivity.java包com.mohit.firebase;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;

public class MainActivity extends AppCompatActivity {

    TextView tv; …
Run Code Online (Sandbox Code Playgroud)

android firebase android-database firebase-realtime-database

26
推荐指数
1
解决办法
4万
查看次数

Android Room数据库事务

使用Android中的新房间数据库,我需要有两个顺序操作需要进行:

removeRows(ids);
insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我看到(在检查数据库时)有一些行丢失 - 我假设它们在插入后被删除.即 第一个操作与第二个操作并行运行.

如果我使用一个事务块,比如这个,那么一切都很好 - 第一个操作似乎在完成第二个之前完成:

roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();

insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

如果我在中间睡觉,那也没关系:

removeRows(ids);
Thread.sleep(500);

insertRows(ids);
Run Code Online (Sandbox Code Playgroud)

Room似乎没有太多的文档,并且想知道我是否应该在完成顺序操作时使用上面的事务块,或者是否有更好的方法.

编辑:在@CommonsWare指出之后,@Query是异步的,@Insert而且@Delete是同步的.鉴于此,我如何获得删除行异步的查询:

@Query("DELETE from table WHERE id IN(:ids)")
int removeRows(List<Long> ids);
Run Code Online (Sandbox Code Playgroud)

根据我得到的构建输出Deletion methods must either return void or return int (the number of deleted rows),如果我尝试将返回类型包装在一个Flowable.

android transactions android-database android-room

22
推荐指数
3
解决办法
2万
查看次数

何时将数据保存到数据库,onPause()或onStop()?

我知道这个问题已被问了一百万次,我自己虽然我已经知道了答案,而且正确的一个是唯一有保证的电话是onPause(),所以你应该把数据保存在那里.

但是,在android文档的许多地方,他们总是建议不要在onPause()方法中做繁重的工作(比如在数据库中写数据),因为它会延迟活动之间的转换.

根据表1中的Android开发人员指南

onPause():此方法通常用于向持久数据提交未保存的更改,停止动画以及可能消耗CPU的其他内容,等等.它应该尽快做任何事情,因为下一个活动在返回之前不会恢复.

Killable:是的

然后根据类似表中的Android Developer Reference Guide.

它说同样的事情但是:

Killable:Pre-HONEYCOMB

并且他们添加了一个说明:

请注意,这些语义在针对从HONEYCOMB开始的平台的应用程序与针对先前平台的平台之间会略有不同.从Honeycomb开始,应用程序在其onStop()返回之前不处于killable状态.这可能会在调用onSaveInstanceState(Bundle)时产生影响(可以在onPause()之后安全地调用它,并允许和应用程序安全地等到onStop()以保存持久状态.


Killable

请注意上表中的"Killable"列 - 对于那些被标记为可填充的方法,该方法返回之后,托管该活动的进程可能在任何时候被系统杀死而不执行其代码的另一行.

对于POST-HONEYCOMB(我不关心早期版本): 那么,可以假设任何Android设备(包括不同的ROMS)将确保在活动上调用onStop吗?这是任何耗费存储写入应用程序的最佳位置?

注意:这是非常令人困惑的,因为这里的大多数答案,网站,书籍,甚至在线Android测试都是正确的答案,你应该将它保存在onPause而不是onStop.

android android-lifecycle android-activity android-database

14
推荐指数
1
解决办法
7063
查看次数

运行模拟器时SQLiteConnection数据库泄漏

我正在运行模拟器并收到有关内存泄漏的以下错误.有趣的是,泄漏的数据库似乎是谷歌gms而不是用户数据库.有谁知道如何修理它?谢谢!

09-27 15:55:07.252 2058-2068/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/user/0/com.google.android.gms/databases/metrics.db' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

09-27 15:55:07.255 2058-2068/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/user/0/com.google.android.gms/databases/help_responses.db' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.

09-27 15:55:07.259 2058-2068/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/user/0/com.google.android.gms/databases/auto_complete_suggestions.db' was leaked!  Please …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks android-database

11
推荐指数
1
解决办法
8422
查看次数

IllegalStateException:设备上的文件系统处于错误状态。WorkManager 无法访问应用程序的内部数据存储

我的应用程序无法打开。当我尝试打开应用程序时,它立即关闭并出现以下崩溃。

仅在一台设备 Redmi note 10s 上发生这种情况。(Android 11)

Workmanager 似乎有问题,但没有找到任何解决方案

The file system on the device is in a bad state. WorkManager cannot access the app's internal data store.Error Message: The file system on the device is in a bad state. WorkManager cannot access the app's internal data store.StackTracejava.lang.IllegalStateException: The file system on the device is in a bad state. WorkManager cannot access the app's internal data store.
    at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:120)
    at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)
    Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-database android-workmanager

10
推荐指数
0
解决办法
676
查看次数

房间使用日期字段

我使用日期转换器类来转换我的日期对象.但是,我仍然遇到一个错误说.错误:无法弄清楚如何将此字段保存到数据库中.您可以考虑为其添加类型转换器.

我的日期转换器类

public class DateConverter {

    @TypeConverter
    public static Date toDate(Long dateLong){
        return dateLong == null ? null: new Date(dateLong);
    }

    @TypeConverter
    public static long fromDate(Date date){
        return date == null ? null :date.getTime();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的数据库表用于使用日期对象.

@Entity(tableName = "userFitnessDailyRecords")

    @TypeConverters(DateConverter.class)
    public class UserFitnessDailyRecords {

        @NonNull
        @PrimaryKey(autoGenerate = true)
        public int id;
        public Date forDay;

        public Date getForDay() {
            return forDay;
        }

        public void setForDay(Date forDay) {
            this.forDay = forDay;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我按照谷歌代码持久性实验室的例子和普通软件室各自的GitHub示例.我正在使用房间版本1.0.0.

android android-date android-database android-room

9
推荐指数
5
解决办法
1万
查看次数

Android Room 数据库创建没有 ID 的实体对象

我的实体类:

@Entity(tableName = "student")
data class Student(
    @PrimaryKey(autoGenerate = true)
    val id: Long,

    val name: String,
    val age: Int,
    val gpa: Double,
    val isSingle: Boolean
) 
Run Code Online (Sandbox Code Playgroud)

问题是,由于id是由Room数据库自动生成的- 意味着无论我id在构造函数中放入什么,它无论如何都会被覆盖,并且因为它是构造函数中的参数之一,我必须id每次都给出像这样:

val student = Student(0L, "Sam", 27, 3.5, true)
Run Code Online (Sandbox Code Playgroud)

我怎样才能避免编造id这样我就可以像这样输入必要的数据:

val student = Student("Sam", 27, 3.5, true)
Run Code Online (Sandbox Code Playgroud)

android kotlin android-database android-room

9
推荐指数
2
解决办法
642
查看次数