Articles of SQLite

如何在Android中正确打开/关闭SQLite数据库

我有一个function正常的应用程序,不会强制关闭或崩溃。 但是当我看到LogCat时,它偶尔会给我这个: 05-20 15:24:55.338: E/SQLiteDatabase(12707): close() was never explicitly called on database ‘/data/data/com.—.–/databases/debt.db’ 05-20 15:24:55.338: E/SQLiteDatabase(12707): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 一点点下来…… 05-20 15:24:55.338: E/System(12707): Uncaught exception thrown by finalizer 05-20 15:24:55.338: E/System(12707): java.lang.IllegalStateException: Don’t have database lock! 我不确定何时应该打开和关闭我的数据库? 我有一个Main活动,只是一个启animation面。 然后它进入一个使用来自DB的信息调用ListView的活动; 所以在这个 DB首次打开的活动中。 还有一个其他活动,其中需要DB与ListVeew分支。 什么时候我应该打开和关闭这个? Word似乎是我只需打开一次,然后在应用程序“暂停”,“停止”或“销毁”时关闭。 […]

如何使用Content Provider实现复杂查询?

我问这个是因为我不太清楚如何使用Android内容提供商。 我有一个包含8个表的数据库的子集,我需要创建复杂的查询来获取一些数据。 我的内容提供商可以很好地处理简单查询 例如,我在PersonModel.java类上有一个表Person,我使用以下方法获取数据: String [] projection = {PersonModel.C_FIRST_NAME, PersonModel.C_LAST_NAME}; Cursor cursor = context.getContentResolver().query( MyProvider.CONTENT_URI_PERSONS, projection, null, null, null); 它完美无缺。 在MyProvider上,我的每个表都有一堆CONTENT_URI常量。 public class MyProvider extends ContentProvider { MyDbHelper dbHelper; SQLiteDatabase db; private static final String AUTHORITY = “com.myapp.models”; //Paths for each tables private static final String PATH_PROFILE_PICTURES = “profile_pictures”; private static final String PATH_PERSONS = […]

SQLiteOpenHelper – 数据库是如何创建的?

我正在制作一个数据库应用程序,我的程序正常工作,我已经理解了我一直关注的大部分教程。 但是,有一方面我不清楚。 有一个内部类的MyDBHelper扩展了SQLiteOpenHelper。 外部variables包括名为d的SQLiteDatabase。 MyDBHelper的代码是: private static class MyDBHelper extends SQLiteOpenHelper { MyDBHelper(Context c) { super(c, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) { Log.w(TAG, “Upgrading database from version ” + oldVers […]

GreenDAO创建自动ID属性

有没有办法让DB以自动方式创建ID属性? 我想生成如下所示的内容: Entity entity = schema.addEntity(“MyEntity”); entity.addIdProperty().autoIncrement().primaryKey(); 这可能吗?

Android:SQLite一对多设计

任何人都有很好的建议如何使用ContentProvider实现SQLite的一对多映射? 如果您查看Uri ContentProvider#insert(Uri, ContentValues)您可以看到它包含要包含要插入的数据的ContentValues参数。 问题是,在其当前实现中, ContentValues不支持put(String, Object)方法,而类是最终的,所以我无法扩展它。 为什么这是一个问题? 我的设计来了: 我有两个一对多关系的表。 为了在代码中表示这些,我有2个模型对象。 1st表示主记录,并且具有一个第二个对象实例列表的字段。 现在我在模型对象#1中有一个辅助方法,它返回从当前对象生成的ContentValues 。 使用ContentValues#put重载方法填充原始字段是微不足道的,但我对列表运气不好。 所以目前我的第二个表行只是一个字符串值,我生成一个逗号分隔的字符串,然后我在ContentProvider#insert重新分析为String []。 感觉很难吃,所以也许有人可以暗示如何以更清洁的方式完成它。 这是一些代码。 首先来自模型类: public ContentValues toContentValues() { ContentValues values = new ContentValues(); values.put(ITEM_ID, itemId); values.put(NAME, name); values.put(TYPES, concat(types)); return values; } private String concat(String[] values) { /* trivial */} 这里是ContentProvider#insert方法的精简版本 public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase […]

Android:数据库与应用程序打包的安全性如何

我想知道用android中的应用程序打包数据库是多么安全。 用户可以轻松访问数据库吗? 由于我拥有的数据库将拥有数据,我不想被用户滥用而被滥用,在移动应用程序中保护数据库的最佳方法是什么? 我的应用程序也将使用Web服务(联系我自己的网站),例如http:\ www.mysite.com/services/xxx 我的网站会将一些数据返回给移动应用。 如果有人反编译java代码(在apk中),他将很容易访问我用于Web服务的URL。 如何保护我的网站数据免受恶意用户的攻击。 如果有人知道URL,他只需在浏览器中键入该URL并获取我不想要的json格式的所有数据,因为这些数据可能非常敏感。 即使我保持编码,用户也可以从java代码(他在反编译apk后获得)中了解编码。 如何保护我的数据库不被滥用? 如果我的应用程序要显示移动设备上的餐馆,酒吧等本地地点,我应该始终使用Web服务从网站上获取它们,或者提供具有这些详细信息的本地数据库,以便可以快速获取信息。 在这种情况下,我可以提供UPDATE Web服务,它将更新本地数据库。 但是本地数据库的安全性对我来说非常重要。 任何人都可以建议在哪里保留数据库以及如何保护它? Rgds,Sapan

Android平台是否支持SpatiaLite?

是否可以在Android平台(1.6)上使用SpatiaLite数据库? 我正在尝试编写一个谷歌类似蜂鸣器的应用程序,它需要利用SpatiaLitefunction,比如计算2点之间的距离等。需要任何外部库吗? 谢谢。

Android:从应用程序中的多个活动访问单个数据库?

我有一个待办事项列表types的应用程序,它将所有的笔记数据存储在sqlite3数据库中。 应用程序中的每个活动都需要访问数据库以实时编辑数据的不同部分。 目前,我让每个活动都打开自己的DBManager对象(我创建的帮助程序类来管理数据库)。 这会导致问题,我想要一个稍微更全面的访问解决方案,所以我不必继续打开/关闭/创建数据库。 我正在考虑几个选项,并希望听到每个选项的优缺点以及其他建议。 单身人士风格。 有一个包装类,它返回对唯一数据库管理器的引用,因此任何需要它的活动都可以使用它。 静态管理器。 让经理类完全是静态成员,让它在加载时打开数据库。 任何需要它的人都可以轻松访问(这是每个人)。 合并在1和2之间。我可以创建一个数据库管理器类来初始化数据库的成员单例实例,并且所有数据操作方法都是静态的。 然后我甚至不需要引用单例来访问数据库。 我最喜欢这个解决方案,请指出缺点。 建议?

Android和SQLite:何时使用分号结束语句?

如果您在Android上使用SQLite的rawQuery()或execSQL()方法,何时应该使用分号来结束语句? 例如,在本教程中 ,作者在create table语句中使用分号(通过execSQL),但不在select语句上使用分号(通过rawQuery)。 例如: 创建表语句: private static final String DATABASE_CREATE = “create table ” + TABLE_COMMENTS + “(” + COLUMN_ID + ” integer primary key autoincrement, ” + COLUMN_COMMENT + ” text not null);”; database.execSQL(DATABASE_CREATE); 选择声明: Cursor cursor = getReadableDatabase(). rawQuery(“select * from todo where _id = ?”, new String[] { id }); 是这样的情况下,使用execSQL()方法的语句最后需要一个分号,但是使用rawQuery()方法的语句不是吗?

如何访问Android Emulator数据库的内容?

我已经阅读了关于如何访问数据库内容的问题的答案,但是我似乎无法在我的机器上运行它。 这是shell日志: C:\android-sdk-windows\tools>adb -s emulator-5554 shell # sqlite3 /data/data/com.android.demo.notepad2/databases/notes sqlite3 /data/data/com.android.demo.notepad2/databases/notes SQLite version 3.5.9 Enter “.help” for instructions sqlite> .tables .tables sqlite> ^C C:\android-sdk-windows\tools> SQLite只是回复我的命令,即使Eclipse文件浏览器告诉我它存在。 如果我使用sqlite3工具并使用“.tables”,则接受命令。 通过模拟器的SQLite语法不同是我错过了什么吗? (很抱歉这么多问题,Android上似乎没有太多连贯的文档!) 谢谢!