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[],并让它们替换?您的选择中的String。这将保护您的数据库免受讨厌的 SQL 注入。

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 回答