我现在正在进行移动编程课程,我们需要创建一个简单的应用程序,用户填写表单并将数据记录在我们自己的自定义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字符串应该是什么样的?我知道我现在的那个是错的,但我对选择字符串应该是什么感到困惑?
答案 0 :(得分:2)
您的投影是String[]
,它将列名称作为其元素。它们不应包含有关特定表的任何信息。请注意,Uri的工作是识别表格(使用内容提供商的setTable
实施中的query
方法)。
mProjection = new String { COLUMN_USERNAME }
您应该将列值放在String[]
中,并让它们替换您的选择?
中的String
。这将保护您的数据库免受令人讨厌的SQL注入。
mSelection = COLUMN_USERNAME + "= ?";
mSelectionArgs = new String { "username" };
然后使用
执行查询Cursor cur = getContentResolver().query(CONTENT_URI,
mProjection,
mSelection,
mSelectionArgs,
null);
除非您的表很小,否则您应该确保在单独的线程上执行查询。这将确保不阻止UI线程。
答案 1 :(得分:0)
SELECT COUNT(*) AS c
FROM tablename
WHERE username = 'Teh us3rer'
LIMIT 1
另外,请确保您在用户名字段中有UNIQUE
约束,以避免数据争用。