0

私は現在、モバイル プログラミング コースを受講しており、ユーザーがフォームに入力する単純なアプリケーションを作成する必要があります。そのデータを取得して、独自のカスタム SQLite データベースに記録します。私はフォーム アクティビティを正常に作成し、広範なエラー チェックと、データベース関連の処理を行う 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)";

私の活動から、送信 onclicklister で私はこれをやっています:

 final Cursor mCursor;
    submit.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            Boolean submitCheck = true;

                      //...and code goes by....//

//Username duplicate check
            String[] mProjection = new String[]{"FormStorage.formstable.Username"};
            mCursor = getContentResolver().query(MyContentProvider.CONTENT_URI,
                    mProjection, null, null, null);

if(mCursor != null) {
                if(mCursor.getCount() > 0) {

                   // Check if username already exists

                }
            }

だから私の質問:

mProjection 文字列はどのように見えるべきですか? 現在持っているものが間違っていることは知っていますが、選択文字列がどうあるべきかについて混乱していますか?

4

2 に答える 2

2

あなたの射影は、String[]列名を要素として保持する です。特定のテーブルに関する情報を含めないでください。テーブルを識別するのは Uri の仕事であることに注意してsetTableください (コンテンツ プロバイダーのquery実装で メソッドを使用します)。

mProjection = new String { COLUMN_USERNAME }

列の値を a に入れ、選択String[]した を置き換える必要があります。これにより、厄介な SQL インジェクションからデータベースが保護されます。?String

mSelection = COLUMN_USERNAME + "= ?";
mSelectionArgs = new String { "username" };

次に、クエリを実行します。

Cursor cur = getContentResolver().query(CONTENT_URI, 
                                        mProjection, 
                                        mSelection, 
                                        mSelectionArgs, 
                                        null);

テーブルが小さい場合を除き、別のスレッドでクエリを実行する必要があります。これにより、UI スレッドがブロックされないことが保証されます。

于 2012-06-22T23:41:40.150 に答える
0
SELECT COUNT(*) AS c
FROM tablename
WHERE username = 'Teh us3rer'
LIMIT 1

また、UNIQUEデータ競合を避けるために、ユーザー名フィールドに制約があることを確認してください。

于 2012-06-22T23:41:53.297 に答える