Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android net.sqlcipher.database.SQLiteException:绑定或列索引超出范围:句柄0x7bf058da88_Android_Android Contentprovider_Android Cursorloader - Fatal编程技术网

Android net.sqlcipher.database.SQLiteException:绑定或列索引超出范围:句柄0x7bf058da88

Android net.sqlcipher.database.SQLiteException:绑定或列索引超出范围:句柄0x7bf058da88,android,android-contentprovider,android-cursorloader,Android,Android Contentprovider,Android Cursorloader,我的内容提供商有问题。我在我的一个活动中使用内容提供者,并使用游标加载程序和适配器来显示列表 当且仅当我未在CursorLoader构造函数中指定selection和SelectionAgs参数时,列表才会显示任务表的内容 我尝试为selection和selection args传递null,这将返回整个表的内容。我试图做的是根据C_TASK_CALLID列选择表的完整投影,并传入CALLID 所以我想做的是返回一个基于sql的游标,如下所示: select * from table TASK

我的内容提供商有问题。我在我的一个活动中使用内容提供者,并使用游标加载程序和适配器来显示列表

当且仅当我未在CursorLoader构造函数中指定selection和SelectionAgs参数时,列表才会显示任务表的内容

我尝试为selection和selection args传递null,这将返回整个表的内容。我试图做的是根据C_TASK_CALLID列选择表的完整投影,并传入CALLID

所以我想做的是返回一个基于sql的游标,如下所示:

select * from table TASK where C_TASK_CALLID = callID;
有人能告诉我为什么我会出现以下错误吗

我已经看了下面的SO帖子,但它表明selection和SelectionAgs之间存在不匹配。在我的情况下,这是不正确的,因为我只传递了一个参数

我得到以下错误:

06-01 14:05:56.631 32037-32037/com.carefreegroup.rr3 E/ViewCompletedTasksActivity: about to create CursorLoader.....LoginValidate.C_TASK_CALLID = taskcallid callID =  d5f5482f-b240-4eb6-8be1-489a8d75af9b
06-01 14:05:56.636 32037-2691/com.carefreegroup.rr3 E/RR3ContentProvider: inside RR3ContentProvider query method
06-01 14:05:56.636 32037-2691/com.carefreegroup.rr3 E/LoginValidate: NfcScannerApplication.getSecretKey() = 12345
06-01 14:05:56.636 32037-2691/com.carefreegroup.rr3 E/RR3ContentProvider: CASE TASKS
06-01 14:05:56.636 32037-2691/com.carefreegroup.rr3 E/RR3ContentProvider: About to do the query method in content provider
06-01 14:05:56.645 32037-2691/com.carefreegroup.rr3 E/CustomExceptionHandler: stack = java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                                  at android.os.AsyncTask$3.done(AsyncTask.java:318)
                                                                                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                                  at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                  at java.lang.Thread.run(Thread.java:762)
                                                                               Caused by: net.sqlcipher.database.SQLiteException: bind or column index out of range: handle 0x7bf058da88
                                                                                  at net.sqlcipher.database.SQLiteProgram.native_bind_string(Native Method)
                                                                                  at net.sqlcipher.database.SQLiteProgram.bindString(SQLiteProgram.java:245)
                                                                                  at net.sqlcipher.database.SQLiteQuery.bindString(SQLiteQuery.java:183)
                                                                                  at net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:48)
                                                                                  at net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1820)
                                                                                  at net.sqlcipher.database.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)
                                                                                  at net.sqlcipher.database.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280)
                                                                                  at com.carefreegroup.rr3.RR3ContentProvider.query(RR3ContentProvider.java:396)
                                                                                  at com.carefreegroup.rr3.RR3ContentProvider.query(RR3ContentProvider.java:23)
                                                                                  at android.content.ContentProvider.query(ContentProvider.java:1027)
                                                                                  at android.content.ContentProvider$Transport.query(ContentProvider.java:243)
                                                                                  at android.content.ContentResolver.query(ContentResolver.java:536)
                                                                                  at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
                                                                                  at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
                                                                                  at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
                                                                                  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
                                                                                  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
                                                                                  at android.os.AsyncTask$2.call(AsyncTask.java:304)
                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                                                                                  at java.lang.Thread.run(Thread.java:762) 

下面是我的任务表:

public static final String C_ID_TASK_QUEST_COMM = BaseColumns._ID;
    public static final String C_TASK_QUEST_COMM_QUESTSION = "taskquestcommquestion";
    public static final String C_TASK_QUEST_COMM_COMMENTS = "taskquestcommcomments";
    public static final String C_TASK_QUEST_ID = "taskquestid";
    public static final String C_TASK_QUEST_TYPE = "taskquesttype";
    public static final String C_TASK_CALLID = "taskcallid";
    public static final String C_TASK_SENT_TO_SERVER = "tasksenttoserver";
    public static final String C_TASK_VALUE = "taskvalue";

下面是我活动中的游标加载程序构造函数:

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        Log.e(TAG, "inside3 onCreateLoader in ViewCompletedTasksActivityAsync");




        String[] projection = { LoginValidate.C_ID_TASK_QUEST_COMM, LoginValidate.C_TASK_QUEST_COMM_QUESTSION, LoginValidate.C_TASK_QUEST_COMM_COMMENTS,
                LoginValidate.C_TASK_QUEST_ID,
                LoginValidate.C_TASK_QUEST_TYPE , LoginValidate.C_TASK_CALLID, LoginValidate.C_TASK_SENT_TO_SERVER, LoginValidate.C_TASK_VALUE};



        String [] selectionArgs = {callID};


        Log.e(TAG, "about to create CursorLoader.....LoginValidate.C_TASK_CALLID = " + LoginValidate.C_TASK_CALLID + " callID = " + callID);

        cursorLoader = new CursorLoader(this, RR3ContentProvider.CONTENT_URI_TASKS, projection, LoginValidate.C_TASK_CALLID, selectionArgs , null);

        return cursorLoader;
    }
@覆盖
公共加载器onCreateLoader(int-id,Bundle-args){
Log.e(标记“ViewCompletedTasksActivityAsync中的inside3 onCreateLoader”);
String[]projection={LoginValidate.C_ID_TASK_QUEST_COMM,LoginValidate.C_TASK_QUEST_COMM,LoginValidate.C_TASK_QUEST_COMM_COMM注释,
LoginValidate.C_任务_任务_任务_ID,
LoginValidate.C_任务\u任务\u类型,LoginValidate.C_任务\u CALLID,LoginValidate.C_任务\u发送到\u服务器,LoginValidate.C_任务\u值};
字符串[]selectionArgs={callID};
Log.e(标记“即将创建游标加载程序…”LoginValidate.C_TASK_CALLID=“+LoginValidate.C_TASK_CALLID+”CALLID=“+CALLID”);
cursorLoader=新的cursorLoader(这个,RR3ContentProvider.CONTENT\u URI\u TASKS,投影,LoginValidate.C\u TASK\u CALLID,selectionArgs,null);
返回游标装入器;
}

以下是我的内容提供商:

public class RR3ContentProvider extends ContentProvider {

   private static final String TAG = RR3ContentProvider.class.getSimpleName();
   NfcScannerApplication nfcAppObj; 

   static final String PROVIDER_NAME = "com.xxxxx.xxx.ContentProvider";





    static final String URLTASKS = "content://" + PROVIDER_NAME + "/tasks";
    static final Uri CONTENT_URI_TASKS = Uri.parse(URLTASKS);


    static final String _ID_TASKS = "_id";
    static final String TASK_QUESTION = "taskquestcommquestion";


    static final String TABLETASKS = "tabletaskquestion";

    private static HashMap<String, String> TASK_PROJECTION_MAP;

    static final int TASKS = 9;
    static final int TASK_ID = 10;





   static final UriMatcher uriMatcher;
   static{
      uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

       uriMatcher.addURI(PROVIDER_NAME, "tasks", TASKS);
       uriMatcher.addURI(PROVIDER_NAME, "tasks/#", TASK_ID);
   }

   /**
    * Database specific constant declarations
    */
   private SQLiteDatabase db;


   @Override
   public boolean onCreate() {


       Context applicationContext = getContext().getApplicationContext();
       nfcAppObj = getRealApplication(applicationContext);



      Log.e(TAG, "inside RR3ContentProvider onCreate");
      return (nfcAppObj == null)? false:true;
   }



   @Override
   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

       Log.e(TAG, "inside RR3ContentProvider query method");


       db = nfcAppObj.getDb();

      SQLiteQueryBuilder qb = new SQLiteQueryBuilder();


      switch (uriMatcher.match(uri)) {








          case TASKS:
              Log.e(TAG, "CASE TASKS");
              qb.setTables(TABLETASKS);
              qb.setProjectionMap(TASK_PROJECTION_MAP);



              /*if (sortOrder == null || sortOrder == ""){

                  sortOrder = LOG_CREATED_TIME + " DESC";
              }*/

              break;

          case TASK_ID:
              Log.e(TAG, "CASE TASK_ID");
              qb.setTables(TABLETASKS);
              qb.appendWhere( _ID_TASKS + "=" + uri.getPathSegments().get(1));

              /*if (sortOrder == null || sortOrder == ""){

                  sortOrder = LOG_CREATED_TIME + " DESC";
              }*/

              break;

      default:

         throw new IllegalArgumentException("Unknown URI " + uri);
      }




      Log.e(TAG, "About to do the query method in content provider");

      Cursor c = qb.query(db,   projection, selection, selectionArgs,
                          null, null, sortOrder);
      /** 
       * register to watch a content URI for changes
       */
      c.setNotificationUri(getContext().getContentResolver(), uri);

      return c;

   }//end of query












   @Override
   public String getType(Uri uri) {
      switch (uriMatcher.match(uri)){
      /**
       * Get all  records 
       */


          case TASKS:
              return "vnd.android.cursor.dir/vnd.example.tasks";
          /**
           * Get a particular record
           */
          case TASK_ID:
              return "vnd.android.cursor.item/vnd.example.tasks";
      default:
         throw new IllegalArgumentException("Unsupported URI: " + uri);
      }
   }
}
公共类RR3ContentProvider扩展了ContentProvider{
私有静态最终字符串标记=RR3ContentProvider.class.getSimpleName();
NfcScannerApplication nfcAppObj;
静态最终字符串提供程序\u NAME=“com.xxxxx.xxx.ContentProvider”;
静态最终字符串URLTASKS=“content://”+PROVIDER\u NAME+“/tasks”;
静态最终Uri内容\u Uri\u任务=Uri.parse(URLTASKS);
静态最终字符串_ID_TASKS=“_ID”;
静态最终字符串TASK\u QUESTION=“taskquestcommquestion”;
静态最终字符串TABLETASKS=“tabletaskquestion”;
私有静态HashMap任务\投影\映射;
静态最终整数任务=9;
静态最终整数任务_ID=10;
静态最终UriMatcher UriMatcher;
静止的{
uriMatcher=新的uriMatcher(uriMatcher.NO_匹配);
addURI(提供者名称,“任务”,任务);
addURI(提供者名称,“tasks/#”,TASK#ID);
}
/**
*特定于数据库的常量声明
*/
专用数据库数据库;
@凌驾
公共布尔onCreate(){
上下文applicationContext=getContext().getApplicationContext();
nfcAppObj=getRealApplication(applicationContext);
Log.e(标记,“内部RR3ContentProviderOnCreate”);
返回值(nfcAppObj==null)?false:true;
}
@凌驾
公共游标查询(Uri Uri、字符串[]投影、字符串选择、字符串[]selectionArgs、字符串排序器){
Log.e(标记,“内部RR3ContentProvider查询方法”);
db=nfcAppObj.getDb();
SQLiteQueryBuilder qb=新的SQLiteQueryBuilder();
开关(uriMatcher.match(uri)){
案例任务:
Log.e(标签“案例任务”);
qb.可设置(TABLETASKS);
qb.setProjectionMap(任务投影映射);
/*if(sortOrder==null | | sortOrder==“”){
sortOrder=LOG\u CREATED\u TIME+“DESC”;
}*/
打破
案例任务标识:
Log.e(标记“案例任务ID”);
qb.可设置(TABLETASKS);
qb.appendWhere(_ID_TASKS+“=”+uri.getPathSegments().get(1));
/*if(sortOrder==null | | sortOrder==“”){
sortOrder=LOG\u CREATED\u TIME+“DESC”;
}*/
打破
违约:
抛出新的IllegalArgumentException(“未知URI”+URI);
}
Log.e(标记“即将在内容提供者中执行查询方法”);
游标c=qb.query(数据库、投影、选择、选择、,
空,空,排序器);
/** 
*注册以查看内容URI的更改
*/
c、 setNotificationUri(getContext().getContentResolver(),uri);
返回c;
}//查询结束
@凌驾
公共字符串getType(Uri){
开关(uriMatcher.match(uri)){
/**
*获取所有记录
*/
案例任务:
返回“vnd.android.cursor.dir/vnd.example.tasks”;
/**
*获取特定记录
*/
案例任务标识:
返回“vnd.android.cursor.item/vnd.example.tasks”;
违约:
抛出新的IllegalArgumentException(“不支持的URI:+URI”);
}
}
}

.

您的sql查询错误!“从表格任务中选择*,其中C_TASK_CALLID=CALLID;“冗余”表格”。更改“select*from TASK where C_TASK_CALLID=CALLID;”

您的查询具有INRECT where STATTE-您正在传递selectionArgs,但没有绑定的位置it@Selvin我在这里找到了解决办法。我以为游标装入器构造函数把所有东西都抽象掉了,所以我只需要传入selection和selectionArgs。但事实证明,我必须执行以下操作并提供占位符。cursorLoader=新的cursorLoader(这个,RR3ContentProvider.CONTENT_URI_任务,投影,LoginValidate.C_任务_CALLID+“=?”,新字符串[]{CALLID.trim()},null);无论如何谢谢你是的。。。你