标签: android-sqlite

如何在android中正确关闭游标

我有这个数据库使用sqlite,我有关闭光标的问题,它说这Application did not close the cursor or database object that was opened here是logcat

10-18 08:40:56.354: E/Cursor(331): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
10-18 08:40:56.354: E/Cursor(331):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
10-18 08:40:56.354: E/Cursor(331):  at standard.internet.marketing.mymovingfriend.SQLHandler.checkMove(SQLHandler.java:1094)
10-18 08:40:56.354: E/Cursor(331):  at standard.internet.marketing.mymovingfriend.ListMovingNames$3.onKey(ListMovingNames.java:98)
10-18 08:40:56.354: E/Cursor(331):  at android.view.View.dispatchKeyEvent(View.java:3735)
10-18 08:40:56.354: E/Cursor(331): …
Run Code Online (Sandbox Code Playgroud)

android android-cursor android-sqlite

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

SQLiteException:表已经存在

我在我的数据库中添加了名为"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)

java sqlite android android-sqlite

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

SQLite中使用的数据类型

我对以下内容在SQLite中声明为数据类型感到困惑:1.email 2.phone number 3.password(有些文章我发现他们使用String而不是int来获取电话号码和密码,为什么会这样?)

sqlite android android-sqlite

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

Ormlite SQLiteCursor:将null上的游标关闭两次或更多次

我有Coach一个具有ScheduleEntity对象集合的类;

public class Coach{

    @ForeignCollectionField(columnName = FIELD_SCHEDULE_ENTITY)
    private Collection<ScheduleEntity> scheduleEntities;
}
Run Code Online (Sandbox Code Playgroud)

[...]

public class ScheduleEntity {

    @DatabaseField(columnName = FIELD_COACH, foreign = true)
    private Coach coach;
}
Run Code Online (Sandbox Code Playgroud)

我想先找回ScheduleEntity教练.

当我这样做时使用QueryBuilder:

public ScheduleEntity getFirstScheduleForCoach(Coach coach) throws SQLException {
    QueryBuilder<ScheduleEntity, Long> queryBuilder = scheduleEntityDao.queryBuilder();
    queryBuilder
            .where()
            .eq(ScheduleEntity.FIELD_COACH, coach);
   return scheduleEntityDao.queryForFirst(queryBuilder.prepare());
Run Code Online (Sandbox Code Playgroud)

一些奇怪的信息出现在logcat中:

Close cursor android.database.sqlite.SQLiteCursor@42321aa0 on null twice or more
Run Code Online (Sandbox Code Playgroud)

但是,当我以另一种方式这样做时:

return scheduleEntityDao.queryForEq(ScheduleEntity.FIELD_COACH, coach).iterator().next();
Run Code Online (Sandbox Code Playgroud)

一切都很好(不关心可能的nullpointer).

这些信息意味着什么?我做错了什么还是正常行为?

android ormlite android-sqlite

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

SQLite数据到RecyclerView

该应用程序包含SQLite数据库中的数据.UI主要是RecyclerView.问题是如何最好地将数据从数据库传输到UI,同时避开主线程?

我原计划使用CursorLoader,ContentProvider和RecyclerView.但阅读它看起来像RecyclerView没有对Cursor提供的数据的开箱即用支持.荡.

那给我留下了一些其他选择......

  1. AsyncTask加载数据,将其放入模型对象,并传递到RecyclerView适配器.除了丑陋之外,它不是配置改变友好的.

  2. 一个自定义Loader,它从SQL加载数据并将其推送到模型对象中.

  3. 使用Cursor加载器,当它返回Cursor迭代它时将数据推送到模型对象.我怀疑这会发生在主线程上,可能会损害性能.

  4. 使用Otto发送请求数据的请求消息,然后通过返回消息返回模型对象集合.可能有大约500个物体,所以我想我可能宁愿滥用奥托这样做.

如果我使用的是模型对象的集合而不是Cursor我看到ContentProvider的好处较少,而且我也失去了UI在数据更改时自动刷新的能力(这可能很有用).

这些选项都没有吸引力,有没有更好的方法?该应用程序在时间压力下,所以无论它需要相当快速实施.不幸的是,UI需要水平滚动并且只针对Lollipop,所以RecyclerView似乎比ListView更好.

android android-contentprovider android-cursorloader android-sqlite android-recyclerview

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

尝试查询列时删除了无效列

我试图在我的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)

sqlite android android-sqlite

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

如何从房间访问中获取游标对象列表?

我正在尝试使用我的代码来使用房间数据库API.对于文档表我已经定义了Entity类Document,当我查询getAll()它时返回我的所有文档.

现在我有了适应器的旧实现,它使用户Cursor(它的a CursorAdapter).在我的DocumentDao类中,我定义了一个方法来获取光标对象列表.我的Dao课程如下:

@Dao
public interface DocumentDao {

    @Query("SELECT * FROM documents")
    List<com.myapp.room.entity.Document> getAll();

    @Query("SELECT * FROM documents")
    List<Cursor> getCursorAll();
}
Run Code Online (Sandbox Code Playgroud)

在编译期间,我收到以下错误:

Error:(20, 18) error: Not sure how to convert a Cursor to this method's return type
Run Code Online (Sandbox Code Playgroud)

Room的官方指南指出:

如果您的应用程序逻辑需要直接访问返回行,则可以从查询中返回Cursor对象,如以下代码段所示:

@Dao
public interface MyDao {
    @Query("SELECT * FROM user WHERE age > :minAge LIMIT 5")
    public Cursor loadRawUsersOlderThan(int minAge);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我是否需要为此目的编写转换器?

android android-sqlite android-room

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

如何从LiveData获取值?

我是第一次使用Room.我正在看一下LiveData概念.我知道我们可以从DB获取记录到LiveData和附加的hasObservers.

@Query("SELECT * FROM users")

<LiveData<List<TCUser>> getAll();
Run Code Online (Sandbox Code Playgroud)

但是我在后台执行同步,我需要从服务器获取数据并将其与RoomDatabase表中名为"users"的数据进行比较,然后从users表中插入,更新或删除.如何在采取任何行动之前遍历LiveData列表?因为如果我把它放入for循环它会给出错误.

或者我不应该在这种情况下使用LiveData吗?

我想我需要打电话

<LiveData<List<TCUser>> getAll().getValue()
Run Code Online (Sandbox Code Playgroud)

但这是正确的做法吗?这里有一些代码可以说明我想要做的事情:

List<User>serverUsers: Is the data received from a response from an API

private void updateUsers(List<User> serverUsers) {
    List<UserWithShifts> users = appDatabase.userDao().getAllUsers();
    HashMap<String, User> ids = new HashMap();
    HashMap<String, User> newIds = new HashMap();

    if (users != null) {
        for (UserWithShifts localUser : users) {
            ids.put(localUser.user.getId(), localUser.user);
        }
    }

    for (User serverUser : serverUsers) {
        newIds.put(serverUser.getId(), serverUser);

        if (!ids.containsKey(serverUser.getId())) {
            saveShiftForUser(serverUser);
        } else {
            User existingUser = ids.get(serverUser.getId());
            //If …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite android-room android-livedata

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

为什么我们需要onUpgrade(); SQLiteOpenHelper类中的方法

我正在学习本教程.http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

可以任何身体请让我清楚这段代码.

 // Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
            + KEY_PH_NO + " TEXT" + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

    // Create tables again
    onCreate(db);
}
Run Code Online (Sandbox Code Playgroud)

问题

onUpgrade();方法的目的是什么?

什么时候叫?正如文档所说this …

database sqlite android sqliteopenhelper android-sqlite

8
推荐指数
2
解决办法
1万
查看次数

房间 - 插入或替换,但保留数据库字段?

我在我的本地数据库中有一个名为event的表,其中包含以下字段:

  • id(PK)
  • 姓名(文字)
  • 约会时间)
  • 最喜欢的(int,0或1)

服务器会给我一个事件列表,没有收藏字段,最喜欢的字段只是本地的.

我正在使用此代码插入事件

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);
Run Code Online (Sandbox Code Playgroud)

问题是,如果一个事件已经存储在本地数据库中,它将丢失最喜欢的属性,并且在插入和替换之后它将始终为false.

有没有办法像这样批量插入,但保留最喜欢的字段?

sqlite android android-sqlite android-room

8
推荐指数
2
解决办法
2262
查看次数