GVKun编程网logo

android – SQLite DB的版本号

11

这篇文章主要围绕android–SQLiteDB的版本号展开,旨在为您提供一份详细的参考资料。我们将全面介绍android–SQLiteDB的版本号,同时也会为您带来AndroidL为什么不用Andr

这篇文章主要围绕android – SQLite DB的版本号展开,旨在为您提供一份详细的参考资料。我们将全面介绍android – SQLite DB的版本号,同时也会为您带来Android L 为什么不用 Android 5.0 的版本号?、android sqlite *.db-journal、Android SQLite DB必须关闭哪些对象、Android SQLiteException:无法将db的区域设置更改为“en_US”的实用方法。

本文目录一览:

android – SQLite DB的版本号

android – SQLite DB的版本号

我正在我的 Android应用程序中的sqlite工作.

我正在做db.getVersion()来获取我的数据库的当前版本.

它在logcat中显示3.

即使在构造函数中,我设置4作为版本号.

public Helper(Context context)
    {
        super(context,DATABASE_NAME,null,4);
    }

我给4,它应该是4作为版本号.

但它的行为不如此.它显示3作为版本号.

请任何建议.

更新: –

public class Helper extends sqliteOpenHelper {
        public static final String  DATABASE_NAME = "helper.db";

        public static final String TITLE = "title";
        public static final String AUTHOR = "author";
        public static final String ISBN = "isbn";

        public Helper(Context context)
        {
            super(context,4);
        }

        @Override
        public void onCreate(sqliteDatabase db) {

                db.execsql( "CREATE TABLE book1(_id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT,author TEXT,isbn INTEGER);");
                Log.v("Create Table","CREATE TABLE book1(_id INTEGER PRIMARY KEY AUTOINCREMENT,isbn INTEGER);");

Log.v("version ","Version number is "+db.getVersion());

}

解决方法

您正在检查onCreate功能中的版本号,为什么? OnCreate函数只能在第一次从头开始创建数据库时被调用,在这种情况下,应该根据您使用的版本来构建数据库.

在创建数据库后,您可以尝试检查数据库版本,并要求获取可读或可写的实例吗?

sqliteDatabase db = new Helper(context).getWritableDatabase();
db.getVersion(); // what value do you get here?

查看android 4.1.1的sql代码源代码,sqliteOpenHelper,在这里似乎db版本应该是0的onCreate函数,我想这可能是以另一种方式在您正在测试的版本上实现的.
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/database/sqlite/SQLiteOpenHelper.java#242

Android L 为什么不用 Android 5.0 的版本号?

Android L 为什么不用 Android 5.0 的版本号?

在上个月的 Google I/O 2014 开发者年会上谷歌新发布的 Android L 系统为什么不用使用以往用数字命名的系统版本号?Android L 不应该是 Android 5.0 吗?为什么要命名为 Android L 呢?

谷歌没有对外界解释过 Android L 的 “L” 的含义,0 按以往的惯例,谷歌有把 Android  历代以来按字母顺序以甜食命名的传统,新版本 Android L 系统中 L 应该来自 5.0 的版本代号 “Lollipop”(棒棒糖)。

Android 历代版本号的命名:

——Android 1.5 Cupcake

——Android 1.6 Donut

——Android 2.1 Eclair

——Android 2.2 Froyo

——Android 2.3 Gingerbread

——Android 3.0 Honeycomb

——Android 4.0 Ice Cream Sandwich

——Android 4.1 ~ 4.3 Jelly Bean

——Android 4.4 KitKat

——Android 5.0 Lollipop 

但是在科技行业,对产品命名的向来都是一件比较主观的事情,并没有外界想象的那样有多么深的含义和层次。有另一个说法,L 在罗马数字中代表 50,所以才有了 Android L 的命名。

其 实在 Android 4.4 Kitkat 在正式发表以前,也是用 Android K-build 来称呼 Android 4.4 APIv19。 在正式使用 Kitkat 这个代号之前 Android APIv19 的代号确实叫做 Key lime pie,在 AOSP 的 commit 记 录上可以找到。

还有一种情况,Google IO 大会上,谷歌发布的不仅有面向移动设备的系统,也有面向家庭娱乐的系统,更有面向便捷的 穿戴设备的系统,甚至还有面向车载系统的系统。但是在这几个系统平台中 Android Wear、Android Auto 、 Android TV 都没有强调版本号,谷歌有意在弱化系统中的版本号。

也许在正式版的 Android L 发布之后,Android L 依然会沿用 Android 5.0 的称号。

android sqlite *.db-journal

android sqlite *.db-journal

这两天由于项目需要开始使用sqlite数据库,可是在操作过程中,在databases文件下生成*.db的同时总会对应生成一个*.db-journal。刚开始在网上查找原因,网上有人说是数据库操作错误时生成的日志,可是再怎么仔细检查,都发现我对数据库的操作都是正确的,不会有异常,而且*.db-journal文件的大小一直是0.

          后来看了下sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了。在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束时,此文件便保存在了磁盘上,以便下次运行时进行事务回滚。

         而android自己的一些机制,又使*.db-journal一直存在。即第一次操作数据库时,*.db-journal文件会被自动创建,且是永久的保存在磁盘中,不会被自动清除的,如果没有操作异常或者不需要事务回滚时,此文件的大小为0。这种机制避免了每次生成和删除*.db-journal文件的开销


Android SQLite DB必须关闭哪些对象

Android SQLite DB必须关闭哪些对象

我在Android应用程序中使用sqlite DB.我无法100%确定在完成对数据库的读/写操作后必须关闭哪些数据库对象:

例如此代码:

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    sqliteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    dbHelper.close(); //2
    db.close(); //3

    return partsAmount ;
}

我需要关闭1、2和3吗?关闭顺序重要吗?

解决方法:

完成游标后,应始终关闭它,游标还要求数据库已打开.

您实际上根本不需要关闭数据库.

dbHelper.close关闭数据库.

当您调用getWritableDatabase或getReabableDatabase(无论如何通常都会得到一个可写数据库)时,它将打开数据库并对其进行缓存,因此通常使用相同的打开方式,直到关闭它.

打开数据库可能会非常繁琐,因此您应尽量减少关闭,这样就不必再次打开它.

Cusror,每个都有一个基础文件槽.文件插槽受到限制,请全部使用它们,应用程序将崩溃.

所以

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    sqliteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    return partsAmount ;
}

就足够了.

Android SQLiteException:无法将db的区域设置更改为“en_US”

Android SQLiteException:无法将db的区域设置更改为“en_US”

我最近更新了一个(开源) Android应用程序,我的用户正在收到一个我无法复制的异常.关键部分是:

android.database.sqlite.sqliteDatabaseLockedException:数据库被锁定(代码5)

接着

导致:android.database.sqlite.sqliteException:无法将db’/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db’的区域设置更改为“en_US”.

这是在Android 2.3 – 4.2.1的设备上,以及在我尝试连接到数据库的应用程序的多个位置.我使用它后关闭数据库.

我找不到关于“无法更改数据库区域设置”异常的信息.当我看到source for SQLiteConnection (line 386)时,似乎是“android_Metadata”表或“使用新的区域设置更新索引”的问题.

Here is the code that’s causing the exception (on Github).

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856) Caused by: android.database.sqlite.sqliteException: Failed to change locale for db '/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db' to 'en_US'.
at android.database.sqlite.sqliteConnection.setLocaleFromConfiguration(sqliteConnection.java:386)
at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:218)
at android.database.sqlite.sqliteConnection.open(sqliteConnection.java:193)
at android.database.sqlite.sqliteConnectionPool.openConnectionLocked(sqliteConnectionPool.java:463)
at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:185)
at android.database.sqlite.sqliteConnectionPool.open(sqliteConnectionPool.java:177)
at android.database.sqlite.sqliteDatabase.openInner(sqliteDatabase.java:804)
at android.database.sqlite.sqliteDatabase.open(sqliteDatabase.java:789)
at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:694)
at android.app.ContextImpl.openorCreateDatabase(ContextImpl.java:854)
at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:229)
at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:224)
at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:164)
at com.airlocksoftware.database.DbInterface.(DbInterface.java:28)
at com.airlocksoftware.hackernews.loader.StoryLoader.loadStories(StoryLoader.java:62)
at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:54)
at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:1)
at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:240)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40)
at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
... 3 more Caused by: android.database.sqlite.sqliteDatabaseLockedException: database is locked (code 5)
at android.database.sqlite.sqliteConnection.nativeExecute(Native Method)
at android.database.sqlite.sqliteConnection.execute(sqliteConnection.java:548)
at android.database.sqlite.sqliteConnection.setLocaleFromConfiguration(sqliteConnection.java:364)
... 24 more

解决方法

这并不能完全回答这个问题,但是您可能还想查看这篇文章,看看您是否可以将其用于DbHelperSingleton,因为它似乎与您面临的错误相同:

Failed to change locale for db ‘/data/data/my.easymedi.controller/databases/EasyMediInfo.db’ to ‘en_US’

关于android – SQLite DB的版本号的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android L 为什么不用 Android 5.0 的版本号?、android sqlite *.db-journal、Android SQLite DB必须关闭哪些对象、Android SQLiteException:无法将db的区域设置更改为“en_US”等相关知识的信息别忘了在本站进行查找喔。

本文标签: