2

Я проверил много похожих вопросов и ответов. Но в большинстве случаев вопросник забыл использовать? как адаптер в выборе. Это просто не для меня. Я написал код следовать Content Provider Basicsjava.lang.IllegalArgumentException: Невозможно связать аргумент с индексом 1, потому что индекс вне диапазона. У оператора есть 0 параметров

И мой код выглядит следующим образом (извините за мой английский)

public class UserDictActivity extends Activity { 
EditText editTextSearch; 
ListView wordList; 
String searchWord; 
Cursor cursor; 
SimpleCursorAdapter adapter; 
// A projection defines the columns that will be returned for each row 
String[] projection = { 
     UserDictionary.Words._ID, 
     UserDictionary.Words.WORD, 
     UserDictionary.Words.LOCALE 
}; 

// Selection defines SELECTE clause "var = ?" 
String seletionClause = null; 

// Selection arguments define the ? in the SELECT clause 
String[] selectionArgs = new String[]{""}; 

// Defines a list of columns to retrieve from the Cursor and load into an output row 
String[] wordListColumns = { 
     UserDictionary.Words.WORD, // Contract class constant containing the word column name 
     UserDictionary.Words.LOCALE // Contract class constant containing the locale column name 
}; 

// Defines a list of View IDs that will receive the Cursor columns for each row 
int[] wordListItems = {R.id.tv_word, R.id.tv_local}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_user_dict); 

    editTextSearch = (EditText) findViewById(R.id.et_search); 

    wordList = (ListView) findViewById(R.id.lv_wordlist); 

    // TODO: Gets a word from the UI 
    searchWord = editTextSearch.getText().toString(); 

    // TODO: Check for invalid or malicious input. 

    // If the word is the empty string, gets everything 
    if (TextUtils.isEmpty(searchWord)) { 
     seletionClause = null; 
     selectionArgs[0] = ""; 
    } else { 
     // TODO: Constructs a selection clause that matches the word that the user entered. 
     seletionClause = UserDictionary.Words.WORD + " = ?"; 

     // TODO: Moves the user's input string to the selection arguments. 
     selectionArgs[0] = searchWord; 
    } 

    doQuery(); 
    // Creates a new SimpleCursorAdapter 
    adapter = new SimpleCursorAdapter(
      getApplicationContext(),    // The application's Context object 
      R.layout.wordlist_item,     // A layout in XML for one row in the ListView 
      cursor,        // The result from the query 
      wordListColumns,      // A string array of column names in the cursor 
      wordListItems,      // An integer array of view IDs in the row layout 
      0         // Flags (usually none are needed) 
    ); 

    wordList.setAdapter(adapter); 
} 

private void doQuery() { 


    // TODO: Does a query against the table and returns a Cursor object 
    cursor = getContentResolver().query(
      UserDictionary.Words.CONTENT_URI, 
      projection, 
      seletionClause, 
      selectionArgs, 
      null        // sortOrder 
    ); 

    // Some providers return null if an error occurs, others throw an exception 
    if (cursor == null) { 
    /* 
    * Insert code here to handle the error. Be sure not to use the cursor! You may want to 
    * call android.util.Log.e() to log this error. 
    * 
    */ 
     Log.e("NullPointerException", "Cursor is NULL"); 
    } 
    // If the Cursor is empty, the provider found no matches 
    else if (cursor.getCount() < 1) { 

     /* 
     * Insert code here to notify the user that the search was unsuccessful. This isn't necessarily 
     * an error. You may want to offer the user the option to insert a new row, or re-type the 
     * search term. 
     */ 
     Toast.makeText(this, "No word found", Toast.LENGTH_SHORT).show(); 
    } else { 
     // Insert code here to do something with the results 

    } 
} 

}

И Error Log как следовать

07-04 07:06:35.788 1622-1622/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.sinyuk.contentproviderdemo, PID: 1622 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sinyuk.contentproviderdemo/com.example.sinyuk.contentproviderdemo.UserDictActivity}: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters. 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

ответ

1

Проблема заключается в ваш, если:

if (TextUtils.isEmpty(searchWord)) { 
     seletionClause = null; 
     selectionArgs[0] = ""; 
    } 

если selectionClause является недействительным и ваш selectionArgs должен быть пустым. Также вам не нужно держать оба в качестве переменных-членов. Но вы можете легко создать экземпляр как в локальной области. Вы также можете сменить подпись doQuery, чтобы принять String selectionClause и String[] selectionArgs, освободив себя от необходимости держать их в качестве класса участников. Например.

if (TextUtils.isEmpty(searchWord)) { 
    seletionClause = null; 
    selectionArgs = null; 
} else { 
    // TODO: Constructs a selection clause that matches the word that the user entered. 
    seletionClause = UserDictionary.Words.WORD + " = ?"; 

    // TODO: Moves the user's input string to the selection arguments. 
    selectionArgs = new String[] { searchWord }; 
} 

doQuery(selectionClause, selectionArgs); 



private void doQuery(String selectionClause, String[] selectionArgs) { 
    // 
} 
0

selectionArgs должен иметь размер нуля или быть нулевым, если selectionClause равно null. В вашем текущем коде это массив, который всегда содержит 1 элемент (который иногда является пустой строкой).

+0

Большое спасибо, это работает. когда я обновляю свой код как «selectionArgs = null», но он ошибочен, если я пишу его так: 'selectionArgs [0] = null' --it говорит, что значение привязки в индексе 1 равно null. Но я вхожу только в одно слово, оно должно быть связано с selectionArgs [0] – Sinyuk