在我的应用程序中,我使用a AsyncTask将一些数据写入事务中的数据库.也可以从UI线程访问此数据库.在查看可用的数据库方法时,我遇到了yieldIfContendedSafely().看起来这个方法应该用于从单独的线程进行事务的任何情况.但除了以下内容之外,几乎没有关于此方法的任何文档:
暂时结束事务以允许其他线程运行.到目前为止,该交易被认为是成功的.在打电话
setTransactionSuccessful之前不要打电话.返回时,将创建一个新事务但未标记为成功.这假定没有嵌套事务(beginTransaction仅被调用一次)并且如果不是这种情况将抛出异常.
以下是我将如何假设您将从线程中使用此方法:
try {
db.beginTransaction();
//insert some stuff into the database here
...
// is this how you use this method?
boolean yielded = db.yieldIfContendedSafely();
if (yielded) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
db.setTransactionSuccessful();
} catch (SQLException e) {
return false;
} finally {
db.endTransaction();
db.close();
}
Run Code Online (Sandbox Code Playgroud)
这是使用此方法的正确方法吗?是否可以db.yieldIfContendedSafely()在同一个事务中多次使用,在多次写入数据库中的不同表之间?有什么建议?
在Android Jellybean 4.1上是否有可能逃避LIKE通配符并仍然喜欢使用索引?
使用:
where field like 'xyz\_abc'
Run Code Online (Sandbox Code Playgroud)
而不是:
where field like 'xyz_abc'
Run Code Online (Sandbox Code Playgroud)
逃避通配符是否适用于Android?如果通配符被转义,它还会使用索引吗?
我目前正在做的是:
where field like 'xyz_abc' and lower(field) = lower('xyz_abc')
Run Code Online (Sandbox Code Playgroud)
由于通配符,这是非常低效的.
谢谢
嗨,我有以下问题:
data.clear();
data.addAll(datasource.getFilesInFolder()); //gets the data from Sqlite database
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
生成此logCat输出:
12-19 14:34:30.864: W/Binder(986): Caught a RuntimeException from the binder stub implementation.
12-19 14:34:30.864: W/Binder(986): java.lang.NullPointerException
12-19 14:34:30.864: W/Binder(986): at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)
12-19 14:34:30.864: W/Binder(986): at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129)
12-19 14:34:30.864: W/Binder(986): at android.os.Binder.execTransact(Binder.java:404)
12-19 14:34:30.864: W/Binder(986): at dalvik.system.NativeStart.run(Native Method)
12-19 14:34:30.864: W/InputMethodManagerService(757): Got RemoteException sending setActive(false) notification to pid 30040 uid 10174
Run Code Online (Sandbox Code Playgroud)
这个例外导致胜利死亡......
好吧,我意识到也许是反过来,WIN DEATH导致这个日志输出,因为在日志WINDEATH之前来了,那么我不知道为什么windeath会发生.
我的适配器是扩展BaseAdapter,没有什么特别之处.以下是非常奇怪的:
提到的代码片段位于自定义侦听器中,该侦听器由另一个类触发.当我将有问题的部分放在听众之外时,它运作良好.
我的Caught a RuntimeException from the binder stub implementation意思是?这可能是数据库的问题吗?或者也许是我的自定义听众?任何人都知道什么是错的?
我有一个问题,我已经解决了,但我仍然想知道为什么解决方案解决了它.我写了一个Android应用程序有一个sqlite数据库后几次我调试它db中的oncreate方法没有被调用(即使一切工作正常)之后我将数据库版本号从1更改为2一切正常即使我通过应用程序管理器卸载了应用程序,也删除了缓存和本地数据库信息.我的问题如下 - 本地数据库数据是否保存在其他地方?万一没有 - 为什么只有在我升级了版本号之后它才起作用,即使我删除了所有与应用程序相关的数据?
/**
* A class to handle sqlite reads/writes of user related data to be collected
*/
public class UserDataManager extends SQLiteOpenHelper {
// Class Variables
private final String TAG = UserDataManager.class.getSimpleName();
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
public static final String DATABASE_NAME = "tmc";
// Tables
private static final String TABLE_USER = "user";
// Tables and table columns names
private String CREATE_USER_TABLE;
private static final String COLUMN_USER_ID = …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,用户通过点击Imageview并设置图像和从相机拍摄新照片来添加图像.我想将该设置图像存储到sqlite数据库中.
**AddkeyEventdetail.java**
package com.example.kidsfinal;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import com.example.slidingmenuexample.R;
public class AddChildHoodEventActivity extends SmartActivity {
ImageView ivChildPics;
EditText edtEventDate, edtEventDetails;
Button btnEventDetailSubmit, btnopenCamera;
Spinner spinnerSelectChild;
Bitmap bmp;
Calendar calendar = Calendar.getInstance();
int mDay = calendar.get(Calendar.DAY_OF_MONTH), mMonth = calendar
.get(Calendar.MONTH), mYear = calendar.get(Calendar.YEAR) - 1;
@Override …Run Code Online (Sandbox Code Playgroud) 我有一个包含三个字段的listview,但我不知道如何保存我的listview android并在用户打开应用程序并将其显示时将其取回.
我想显示listview中保存的数据,我必须保存用户输入列表视图的新数据.
我有一个Android应用程序,它使用服务每5ms收集传感器数据并将其插入sqlite表.在典型的会话中,将有大约40分钟的录音.所有这些代码似乎都运行良好.
我有一个奇怪的问题,如果用户导航到特定的片段,我会收到CursorWindow: Window is full: requested allocation XXX错误.我不确定导致该错误的特定片段有什么特别之处,并且只发生在这个片段中
有问题的片段包含一个按钮,点击该按钮时会执行以下操作:
.db文件的副本创建到外部存储片段代码看起来像这样(为简洁起见,许多catch块都被省略了 - 它们大多只是记录信息):
public class SaveFragment extends Fragment implements View.OnClickListener {
Button saveButton;
MainActivity mainActivity;
DBHelper dbHelper;
Boolean subjectDataExists;
MediaScanner mediaScanner;
static ProgressDialog dialog;
public SaveFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_save, container, false);
//Get save button view
saveButton = (Button) view.findViewById(R.id.saveButton);
saveButton.setOnClickListener(this);
//Get DBHelper
dbHelper …Run Code Online (Sandbox Code Playgroud) sqlite android android-fragments android-cursor android-sqlite
我有三个表,即交易,预付和贷款,当我在贷款中输入一些价值时,直到我在特定日期/月的交易中输入一些值才会显示.
所以有人能告诉我如何克服这个问题吗?
SELECT strftime('%m-%Y', tradedate) as 'month',
(SELECT IFNULL (SUM(FTL.tradebalanceamount),0 )
FROM farmertradelabel as FTL
WHERE FTL.mobileno = '9486032141' AND strftime('%m-%Y', FTL.tradedate) = strftime('%m-%Y', farmertradelabel.tradedate)
ORDER BY strftime('%m-%Y', FTL.tradedate) DESC) AS tradeamount,
(SELECT IFNULL (SUM(advanceamount),0)
FROM advancelabel
WHERE advancelabel.mobileno = '9486032141' AND strftime('%m-%Y', advancelabel.advancedate) = strftime('%m-%Y', farmertradelabel.tradedate)
ORDER BY strftime('%m-%Y', advancelabel.advancedate) DESC) AS advanceamount,
(SELECT IFNULL (SUM(loantotalamount),0)
FROM loanlabel
WHERE loanlabel.mobileno = '9486032141' AND strftime('%m-%Y', loanlabel.loandate) = strftime('%m-%Y', farmertradelabel.tradedate)
ORDER BY strftime('%m-%Y', loanlabel.loandate) DESC) AS loanamount
FROM farmertradelabel
Run Code Online (Sandbox Code Playgroud) 我过去一直在为大多数项目使用SugarDB.它很容易使用并且满足了我的大多数要求,但由于该项目已被放弃,因此决定寻找替代方案,而房间似乎是最佳选择.
然而,一些基本的东西在Room中相当混乱.My Object使用Gson填充来自Web服务的数据,例如链接到其他对象.例如,请考虑以下类:
@Entity
public class TestModel
{
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private String age;
private List<Book> issuedBooks;
}
public class Book
{
private String title;
private int ISBN;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我的第一个类被注释为实体,那么这会自动将其中引用的类视为实体吗?
如果我保存TestModel的对象,它会将带有它的Books列表保存到数据库中吗?
最近我一直在搞乱Android架构组件(更具体地说是Room),但我遇到了一些障碍.
我已经成功构建了一个Room数据库,用于存储部门及其人员的列表.以前,此数据是从服务器中提取的,但未在本地存储.搜索功能也是远程处理的,所以我现在也希望在本地处理搜索功能,但我对SQL的了解有点缺乏.
查看服务器上的SQL代码,搜索语句使用一堆REGEXP函数根据提供的查询搜索两个数据库.这似乎不是处理搜索的最佳方式,但它运作得相当好,并给出了快速响应.所以我尝试在本地模仿这个,但很快发现REGEXPAndroid上不支持(不使用NDK).
至于LIKE和GLOB运营商,他们似乎非常有限.例如,我没有看到一种方法可以同时匹配多个关键字; 而REGEXP我可以用一个or(|)运算符替换空格来实现这个功能.
所以,寻找替代方案我遇到了全文搜索(FTS); 这是Android文档中实现搜索的方法.虽然看起来FTS用于搜索完整文档,而不是像我的用例那样简单的数据.
无论如何,Room不支持 FTS .
所以,当然,我试图强制Room创建一个FTS虚拟表而不是一个标准表,通过创建一个实现SupportSQLiteOpenHelper.Factory就是这样.这个实现几乎是默认的直接副本FrameworkSQLiteOpenHelperFactory,以及相关的框架类.必要的代码位于SupportSQLiteDatabase,我覆盖execSQL以在必要时注入虚拟表代码.
class FTSSQLiteDatabase(
private val delegate: SQLiteDatabase,
private val ftsOverrides: Array<out String>
) : SupportSQLiteDatabase {
// Omitted code...
override fun execSQL(sql: String) {
delegate.execSQL(injectVirtualTable(sql))
}
override fun execSQL(sql: String, bindArgs: Array<out Any>) {
delegate.execSQL(injectVirtualTable(sql), bindArgs)
}
private fun …Run Code Online (Sandbox Code Playgroud) android full-text-search android-sqlite android-search android-room