0

そのため、ユーザーがフォームを送信し、データがデータベースに記録されるクラスのアプリケーションを作成しています。現在、ユーザーが選択しようとしているユーザー名がデータベースに存在するかどうかをチェックするチェックを実装しようとしています。ここに私のコードがあります:

//Username duplicate check                                                                                                                       
String mSelection = MyContentProvider.COLUMN_USERNAME + "= ?";
String[] mSelectionArgs = new String[] { "Username" };
String[] mProjection = new String[]{MyContentProvider.COLUMN_USERNAME};
mCursor = getContentResolver().query(MyContentProvider.CONTENT_URI,
                                     mProjection,
                                     mSelection,
                                     mSelectionArgs, 
                                     null);
if (mCursor.moveToFirst()){
if (userName.getText().toString().equals(mCursor.getString(mCursor.getColumnIndex(MyContentProvider.COLUMN_USERNAME)))){
    submitCheck = false;
    userName.setHint("Username taken");
}   

mCursor.close();

これを実行すると、if ステートメントでエラーが発生します。ログキャットは次のとおりです。

06-24 00:56:55.125: E/AndroidRuntime(907): FATAL EXCEPTION: main
06-24 00:56:55.125: E/AndroidRuntime(907): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.database.CursorWrapper.getString(CursorWrapper.java:114)
06-24 00:56:55.125: E/AndroidRuntime(907):  at com.connor.black.HomeWork2Activity$1.onClick(HomeWork2Activity.java:132)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.view.View.performClick(View.java:3511)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.view.View$PerformClick.run(View.java:14105)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.os.Handler.handleCallback(Handler.java:605)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.os.Looper.loop(Looper.java:137)
06-24 00:56:55.125: E/AndroidRuntime(907):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-24 00:56:55.125: E/AndroidRuntime(907):  at java.lang.reflect.Method.invokeNative(Native Method)
06-24 00:56:55.125: E/AndroidRuntime(907):  at java.lang.reflect.Method.invoke(Method.java:511)
06-24 00:56:55.125: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-24 00:56:55.125: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-24 00:56:55.125: E/AndroidRuntime(907):  at dalvik.system.NativeStart.main(Native Method)

いくつかのコンテキストについて、私のコンテンツ プロバイダーを少し示します。

public class MyContentProvider extends ContentProvider{
public final static String DBNAME = "FormStorage";
public static final String AUTHORITY = "com.connor.black.provider";
public final static String TABLE_NAMESTABLE = "formstable";
private static UriMatcher sUriMatcher;

public final static String COLUMN_FIRSTNAME = "FirstName";
public final static String COLUMN_LASTNAME = "LastName";
public final static String COLUMN_PHONE = "PhoneNumber";
public final static String COLUMN_EMAIL = "Email";
public final static String COLUMN_USERNAME = "Username";
public final static String COLUMN_PASSWORD = "Password";
public final static String COLUMN_GENDER = "Gender";
public final static String COLUMN_COUNTRY = "Country";
public static final Uri CONTENT_URI = Uri.parse("content://com.connor.black.provider/" + TABLE_NAMESTABLE);


private static final String SQL_CREATE_MAIN = "CREATE TABLE " + TABLE_NAMESTABLE + "("+"_ID INTEGER PRIMARY KEY, "+
                                                                    "FirstName TEXT, " +
                                                                    "LastName TEXT, " +
                                                                    "PhoneNumber TEXT, " +
                                                                    "Email TEXT, " +
                                                                    "Username TEXT, " +
                                                                    "Password TEXT, " +
                                                                    "Gender TEXT, " +
                                                                    "Country TEXT)";
4

2 に答える 2

0

列のインデックス値をコードに直接ハード コードしないでください。それの訳は、

  1. 貧弱なデザインです。

  2. プロジェクトの保守が困難になります (つまり、後でテーブルに列を追加すると、列の整数が変更され、コードが壊れる可能性があります)。

  3. 0ユーザー名列に対応しているかどうかを確実に知る方法はありません。整数値は、SQLite データベースを管理する内部ライブラリによって割り当てられます... Android チームがいつでも実装を変更する可能性があるため、内部ライブラリに依存しないでください。

コードを次のように変更することをお勧めします。

int userCol = mCursor.getColumnIndex(MyContentProvider.USERNAME_COLUMN);
mCursor.getString(userCol);
于 2012-06-24T04:42:39.637 に答える
0

0 番目はテーブルの _ID のようです。5 番目のインデックスで試してみてください........

于 2012-06-24T04:42:48.950 に答える