我有这个数据库使用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) 我在我的数据库中添加了名为"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) 我对以下内容在SQLite中声明为数据类型感到困惑:1.email 2.phone number 3.password(有些文章我发现他们使用String而不是int来获取电话号码和密码,为什么会这样?)
我有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).
这些信息意味着什么?我做错了什么还是正常行为?
该应用程序包含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) 我正在尝试使用我的代码来使用房间数据库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)
我的问题是我是否需要为此目的编写转换器?
我是第一次使用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) 我正在学习本教程.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 …
我在我的本地数据库中有一个名为event的表,其中包含以下字段:
服务器会给我一个事件列表,没有收藏字段,最喜欢的字段只是本地的.
我正在使用此代码插入事件
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);
Run Code Online (Sandbox Code Playgroud)
问题是,如果一个事件已经存储在本地数据库中,它将丢失最喜欢的属性,并且在插入和替换之后它将始终为false.
有没有办法像这样批量插入,但保留最喜欢的字段?