Articles of 数据库

是否可能丢失SQLite数据库连接?

我看到很少”java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.” 来自Android应用的例外情况。 我没有在许多地方关闭连接。 在某些其他线程中,连接也可能被关闭。 只是为了确保,SQLite连接是自动关闭还是由操作系统隐式关闭?

这个为ListView定制的CursorAdapter是否为Android正确编码?

我从未对自定义CursorAdapter上的代码感到满意,直到今天我决定复习它并修复一个困扰我很长时间的小问题(有趣的是,我的应用程序的用户都没有报告过这样的问题)。 这是我的问题的一个小描述: 我的自定义CursorAdapter覆盖了newView()和bindView()而不是getView()就像我看到的大多数示例一样。 我在这两种方法之间使用ViewHolder模式。 但我的主要问题是我为每个列表项使用的自定义布局,它包含一个ToggleButton 。 问题是当列表项视图滚出视图然后滚动回视图时,按钮状态不会保留。 存在这个问题是因为当按下ToggleButton并且它总是拉动相同的数据时, cursor从未意识到数据库数据已更改。 我单击ToggleButton时尝试重新查询光标并解决了问题,但速度非常慢。 我已经解决了这个问题,我将全class发布在这里进行审核。 我已经针对这个特定问题彻底评论了代码,以便更好地解释我的编码决策。 这段代码对你来说好看吗? 你会以某种方式改进/优化或改变它吗? PS:我知道CursorLoader是一个明显的改进,但我暂时还没有时间处理这么大的代码重写。 这是我在路线图中的一些东西。 这是代码: public class NotesListAdapter extends CursorAdapter implements OnClickListener { private static class ViewHolder { ImageView icon; TextView title; TextView description; ToggleButton visibility; } private static class NoteData { long id; int iconId; String title; String description; int position; } […]

选择Android项目的ORM(最低API级别7)

我目前有一个应用程序,其主要性能问题是使用由JSON响应组成的基于文件的数据库。 我想重写我的应用程序以使用SQLite数据库function。 因为我很懒,所以我想使用某种ORM。 到目前为止,我发现只有两个大的ORM库: ORMLite GreenDAO ORM DB4O ActiveAndroid 我的主要目标是尽可能提高处理数据的性能 但我发现这些库存在两个可能的问题。 ORMLite使用注释 ,由于此错误 ,这是预蜂窝中的大性能问题 GreenDAO正在使用某种代码生成器,这会减慢开发速度,因为我必须编写生成器,然后使用生成的代码。 而且我不太喜欢这个想法。 DB4O是JPA,我一直认为它在内存使用方面既慢又重,因此不适合低端设备(请记住Android API v7) ad @ChenKinnrot : 估计的负载应足以考虑使用ORM。 在我的例子中,它是大约25-30个唯一表,并且至少有10个表连接(一次2到4个表)。 大约300-500个独特字段(列) 所以我的问题是: 我应该在Android应用程序中使用ORM / JPA层吗? 如果是这样,你会建议我使用哪个图书馆? (请加上一些论点)

如何在Android上的Play商店上传我的应用程序的新版本之前测试升级sqlite数据库

我发现在更新应用版本后,我上传的应用程序中没有find“table_name”这样的表。 我在测试后出来我只是在将旧版本的应用程序升级到新版本的应用程序之后才遇到此问题 我所实施的内容 我已经在onUpgrade()方法中完成了代码,并且还在构造函数中升级了db版本,但我无法在设备中对其进行测试。 步骤1)将版本代码1增加到2 public databasehelper(Context context) { super(context, DATABASE_NAME, null, 2); this.myContext = context; try { createDataBase(); openDataBase(); } catch (IOException e) { e.printStackTrace(); } } 步骤2)将新表添加到onUpgrade()方法中 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.e(“onUpgrade db”, “>>>>called”); switch (oldVersion) { case 1: db.execSQL(DATABASE_CREATE_notification_counter); Log.e(“db version”, “>>>”+oldVersion); // we want both […]

Android将MMS添加到数据库

我想在设备数据库中添加一些MMS消息。 我有以下代码,但它根本不起作用。 没有条目添加到本机应用程序… public static Uri insert(Context context, String[] to, String subject, Uri messageUri) { try { Uri destUri = Uri.parse(“content://mms/sent”); // Get thread id Set recipients = new HashSet(); recipients.addAll(Arrays.asList(to)); long thread_id = getOrCreateThreadId(context, recipients); Log.e(“>>>>>>>”, “Thread ID is ” + thread_id); // Create a dummy sms ContentValues dummyValues = new ContentValues(); dummyValues.put(“thread_id”, thread_id); […]

如何将现有的SQLite应用程序迁移到Room Persistance Library?

提问可能有点早,但是有可能以及如何将现有的SQLite数据库应用程序迁移/升级到新的Android Room Persistance Library吗?

Android中的数据库访问

我正在创建一个Android应用程序,基本上是关于蘑菇的信息列表。 我从sqlite数据库中获取此信息。 我有一个全局单例,里面有一个服务类,我用它来访问我的数据库。 几乎每个活动都访问数据库。 最好是让我的数据库一直打开,还是打开并关闭它,因为我需要数据? 如果最佳做法是始终保持打开状态,那么我需要确保关闭它,如果我在活动被销毁时将其保持打开状态,最糟糕的情况是什么?

在Android SQLite中使用COLLATE – 在LIKE语句中忽略Locales

在Android中创建SQLite数据库时,我设置了数据库语言环境 – db.setLocale(new Locale(“cz_CZ”))。 这是一个捷克语的地方。 SELECT语句起作用并考虑区域设置,例如: SELECT * from table WHERE name=’sctzy’ COLLATE LOCALIZED 会find条目’ščťžý’。 但使用LIKE将失败: SELECT * from table WHERE name LIKE ‘%sctzy%’ COLLATE LOCALIZED 没有返回行。 BTW。 Android中没有java.text.Normalized类。 我以为我可以用标准化的文本制作第二列,删除特殊字符,这些字符将用于搜索 – 但我缺少一个类或方法如何规范化String。

多个ContentProviders的CursorLoader

我需要创建一个ListAdapter来呈现来自多个ContentProviders的数据。 ContentProviders本身代表一个来自关系数据库的表。 我想使用CursorLoader系统将聚合数据检索到ListView中。 这可能与1个装载机有关,还是需要使用多个装载机? 我更喜欢用一个。 我不确定除了在代码中手动连接之外我怎么能让2个ContentProviders互相交互,这似乎也不是一个很好的选择。

Android:有更好的方法来插入和/或更新数据库条目吗?

我有一个包含userId和注释的数据库。 用户不知道数据库中是否已有注释,因此他们写了一个,然后单击“提交”按钮。 如果没有userId的注释或更新userId已经存在的注释,我想插入此注释: notesDb.open(); boolean updateResult = notesDb.updateMessage( userId, details_notes_input.getText().toString()); if(updateResult == true) { Log.d(“databaseTester”, “Updated entry into table”); } else { Log.d(“databaseTester”, “FAILED to update entry into table”); long insertResult = notesDb.insertMessage( userId, details_notes_input.getText().toString()); if(insertResult == -1){ Log.d(“databaseTester”, “Failed to insert entry into table”); } else { Log.d(“databaseTester”, “Inserted entry into table”); } } […]