Articles of SQLite

更新后保留SQLite数据

我有一个带有3个表的sqlite的应用程序。 我担心的是,如果我引入一个添加另一个表的更新(这样就是4个表),那么更新后的版本将消灭数据库。 如果备份在更新之前发生并且在更新之后恢复,我该如何备份/恢复数据库? 如果我使用IO(复制到SD卡并复制回来),那么它将失败。 我想可能是将数据导出到xml并手动加载。 还有另一种方式吗? 关于如何做的任何例子?

如何使用Drive.API从Google云端硬盘下载文件?

我正在使用Google Drive.Api,以便将用户的应用数据与用户驱动器帐户同步。 用户数据库采用sqlite数据库格式。 我已成功将文件以二进制forms上传到驱动器,但无法从应用程序中下载文件。 我如何得到文件URl: final GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE)); credential.setSelectedAccountName(accountName); service = new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build(); Query query = new Query.Builder() .addFilter(Filters.eq(SearchableField.TITLE, “BackupFile”)) .build(); final DriveFolder folder = Drive.DriveApi.getRootFolder(mGoogleApiClient); folder.queryChildren(mGoogleApiClient, query).setResultCallback(new ResultCallback() { @Override public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) { final MetadataBuffer metadataBuffer = metadataBufferResult.getMetadataBuffer(); int iCount = metadataBuffer.getCount(); if (iCount == 1) […]

在创建与SQLite数据库交互的方法/活动时,我应该多么小心使用线程安全性?

我正在创建一个应用程序,允许从TabActivity (最多~25)启动许多不同的Activities 。 大多数活动都需要来自sqlite数据库的数据,因此当运行onCreate时, AsyncTask会创建一个SQLiteOpenHelper对象(将打开一个可读/可写数据库),运行查询,检索数据,然后关闭所有内容。 我只是在测试乱搞,看看我是否可以打破一些东西,所以我将每个Activity添加到TabActivity’s TabHost 。 然后我开始尽快将每个标签混合在一起。 我注意到很快我开始在LogCat中看到: Caused by: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE; 而应用程序继续死亡。 TabHost通常只有大约4-6个选项卡(我可以只限制用户)。 我没有能够用少量标签来破坏任何东西,但是我仍然担心我可能会以糟糕的方式访问数据库。 如何防止我的SQLiteDatabase对象导致锁定? 如果我创建一个ContentProvider将消除数据库锁定的可能性? 您对从SQLiteDatabase访问数据所做的更改有什么建议吗? 我最终采用了使用Application类并存储1个SQLiteOpenHelper并尽力使其保持同步。 这似乎工作得很好 – 我将所有25个活动放在TabHost并且没有错误地将它们捣碎。 我正在调用((SQLiteDbApplication)getApplication()).setDbHelper(new DBHelper(this, Constants.DB_NAME, null, Constants.DB_VERSION_CODE)); 在我的活动中的每个onCreate()中的方法(如下所示) 对此方法或使用此Application类所做的更改的任何进一步建议? import android.app.Application; import android.database.sqlite.SQLiteDatabase; public class SQLiteDbApplication extends Application { private DBHelper dbHelper; private SQLiteDatabase db; public synchronized DBHelper getDbHelper() […]

如果以.00结尾,则如何比较双精度表的字符串表示

我目前正在为我的应用程序中的ContentProvider编写测试用例(这是一个支票簿录制应用程序),并且在比较双值时我正在测试失败。 说明这一点的最好方法是使用代码。 我有这个函数,它返回要插入数据库的帐户对象的ContentValues: private ContentValues getAccountContentValues(){ String testName = “Capital One”; double testStartingBalance = 3000.00; ContentValues accountValues = new ContentValues(); accountValues.put(AccountEntry.COLUMN_NAME, testName); accountValues.put(AccountEntry.COLUMN_BALANCE, testStartingBalance); return accountValues; } 在函数testInsertReadProvider()内部,我有以下代码,用于插入该帐户: // Get Account values and write them ContentValues accountValues = getAccountContentValues(); Uri accountInsertUri = mContext.getContentResolver().insert(AccountEntry.CONTENT_URI, accountValues); long accountRowId = ContentUris.parseId(accountInsertUri); // Verify we got a row back […]

SQLite按字母顺序排序特殊字符

我正在构建一个用于教人法语的应用程序。 当我尝试对一些法语单词进行排序时,最终不会出现在我想要的地方,例如: 阿列尔 Boire 恩 理由 Vouloir 将按以下顺序排序: 阿列尔 Boire 恩 Vouloir 理由 我目前使用的SQL语句是: SELECT name, assignment_id FROM GrammarAssignments ORDER BY name COLLATE NOCASE

Android应用内存中SQLite数据库的最大大小?

我的Android应用程序的数据库有多大? 有限制吗? 出于性能和安全原因,我不想将数据库存储在SD卡上。

Android SQLite:使用新数据库替换旧数据库或使用迁移脚本

我有一个Android应用程序使用SQLite数据库和Active Android作为ORM。 在每个应用程序更新时,我需要使用新的/更新的数据发送我的数据库。 这就是我一直在做的事情 我有一个my_app.db数据库 我对my_app.db的行,表等进行了修改 我将修改后的my_app.db保存为my_app_v2.db (依此类推) 我用my_app_v2.db替换assets文件夹的my_app.db文件,并将其设置为默认数据库 我使用新创建的my_app_v2.db编译并运行程序 因此,当用户获取应用程序时,它将使用带有新内容的my_app_v2.db 。 我知道Active Android 支持迁移脚本 ,但在每次数据库更新时,我需要添加/更新大约2000多条记录。 因此,对于每个数据库更新,我需要一个具有2000+插入/更新语句的迁移脚本,这意味着对于3次以上的连续升级,应用程序必须执行大约6000多个语句。 我想知道我用新的数据库替换整个数据库的方法是不好的做法,应该首选迁移脚本。

EditText afterTextChanged不起作用

我使用下面的代码将Uri图像插入到SQLite中: 寄存器 private void insertData( String name,String pass, Uri image) throws SQLiteException { database = mdb.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(MyDatabaseHelper.KEY_NAME, name); cv.put(MyDatabaseHelper.KEY_PASSWORD, pass); try { database = mdb.getWritableDatabase(); InputStream iStream = getContentResolver().openInputStream(image); byte[] inputData = Utils.getBytes(iStream); cv.put(MyDatabaseHelper.KEY_IMAGE,inputData); }catch(IOException ioe) { Log.e(TAG, ” Error : ” + ioe.getLocalizedMessage()); } database.insert(MyDatabaseHelper.TABLE_USER, null, cv); Toast.makeText(getApplicationContext(),”Database Created”,Toast.LENGTH_SHORT).show(); […]

在SQLite for Android中插入TimeStamp

我有以下字段 1> WorkName – Varchar 2> TimeStap 我想用上面的字段创建一个表。 什么是TimeStamp数据types 如何将时间戳值插入表中。 插入数据时的时间戳值是什么或如何获取时间戳。 我曾经在SQLite上工作,但没有任何将TimeStamp作为字段添加到表中并为其添加值的经验。 我应该使用什么样的CREATE和INSERT语句?

Android:带有CheckBox的ListView,从SQLite数据库填充不太正常

与此处的其他几篇文章一样,我正在尝试创建一个ListView,其中包含每行的CheckBox,并使用SQLite数据库来存储选择的当前状态。 从http://appfulcrum.com/?p=351上的示例开始,我没有完全正常工作,我创建了一个创建数据库的简单应用程序,用20个项目填充它,并显示列表。 它成功检索状态并存储选择的状态。 但是,如果我更改它,它无法正确显示CheckBox状态,滚动到列表的另一端,然后向后滚动。 例如,如果我选择第一个CheckBox,滚动到底部,然后返回到顶部,则不再设置CheckBox。 这是在Android 2.1三星手机上运行。 如果我返回主屏幕,返回列表,CheckBox 已正确设置,因此数据库确实已更新。 该示例扩展了SimpleCursorAdapter,并且getView()根据表中选择列的值,根据需要使用true或false调用setChecked()。 以下是所有来源。 我当然很感激被告知,“呃,这是你的问题……” CustomListViewDB.java // src/CustomListViewDB.java package com.appfulcrum.blog.examples.listviewcustomdb; import android.app.ListActivity; import android.database.Cursor; import android.database.SQLException; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; public class CustomListViewDB extends ListActivity { private ListView mainListView = null; CustomSqlCursorAdapter adapter = null; private SqlHelper dbHelper […]