标签: android-sqlite

在Android多线程应用程序中正确使用yieldIfContendedSafely()

在我的应用程序中,我使用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()在同一个事务中多次使用,在多次写入数据库中的不同表之间?有什么建议?

multithreading android android-sqlite

7
推荐指数
1
解决办法
1758
查看次数

Android SQLite LIKE转义通配符

在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)

由于通配符,这是非常低效的.

谢谢

sqlite android android-sqlite

7
推荐指数
1
解决办法
3280
查看次数

关于notifyDataSetChanged()的WinDeath

嗨,我有以下问题:

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 android-listview android-sqlite

7
推荐指数
1
解决办法
3110
查看次数

对于android上的regualr sqlite操作的奇怪行为

我有一个问题,我已经解决了,但我仍然想知道为什么解决方案解决了它.我写了一个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)

sqlite android android-sqlite

7
推荐指数
1
解决办法
265
查看次数

我想将图像存储在sqlite数据库中,该数据库取自图库和相机android

我有一个应用程序,用户通过点击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)

android image-gallery imageview android-sqlite

7
推荐指数
1
解决办法
3355
查看次数

如何在android中保存listview并在需要时将其取回?

我有一个包含三个字段的listview,但我不知道如何保存我的listview android并在用户打开应用程序并将其显示时将其取回.

我想显示listview中保存的数据,我必须保存用户输入列表视图的新数据.

android android-networking android-listview android-sqlite

7
推荐指数
1
解决办法
1010
查看次数

特定片段中的Android游标窗口内存错误

我有一个Android应用程序,它使用服务每5ms收集传感器数据并将其插入sqlite表.在典型的会话中,将有大约40分钟的录音.所有这些代码似乎都运行良好.

我有一个奇怪的问题,如果用户导航到特定的片段,我会收到CursorWindow: Window is full: requested allocation XXX错误.我不确定导致该错误的特定片段有什么特别之处,并且只发生在这个片段中

有问题的片段包含一个按钮,点击该按钮时会执行以下操作:

  • 在外部存储上创建一些目录
  • 复制临时表中的所有传感器数据,并将其插入更永久的表中
  • 将整个.db文件的副本创建到外部存储
  • 获取表的内容并将其写入CSV文件
  • 查询另一个传感器数据表,并将所有传感器数据写入另一个CSV文件
  • 使用媒体扫描程序扫描导出目录中的所有文件,以便可以通过MTP访问它们

片段代码看起来像这样(为简洁起见,许多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

7
推荐指数
0
解决办法
187
查看次数

数据从特定表的日期而不是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)

sqlite android android-sqlite

7
推荐指数
1
解决办法
126
查看次数

室内一对多关系

我过去一直在为大多数项目使用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 android-sqlite android-room

7
推荐指数
2
解决办法
7205
查看次数

用房间实现搜索

最近我一直在搞乱Android架构组件(更具体地说是Room),但我遇到了一些障碍.

我已经成功构建了一个Room数据库,用于存储部门及其人员的列表.以前,此数据是从服务器中提取的,但未在本地存储.搜索功能也是远程处理的,所以我现在也希望在本地处理搜索功能,但我对SQL的了解有点缺乏.

查看服务器上的SQL代码,搜索语句使用一堆REGEXP函数根据提供的查询搜索两个数据库.这似乎不是处理搜索的最佳方式,但它运作得相当好,并给出了快速响应.所以我尝试在本地模仿这个,但很快发现REGEXPAndroid上不支持(不使用NDK).

至于LIKEGLOB运营商,他们似乎非常有限.例如,我没有看到一种方法可以同时匹配多个关键字; 而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

7
推荐指数
2
解决办法
3607
查看次数