Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:检查用户是否存在(在Android程序中)_Android_Sqlite - Fatal编程技术网

SQLite:检查用户是否存在(在Android程序中)

SQLite:检查用户是否存在(在Android程序中),android,sqlite,Android,Sqlite,我现在正在学习移动编程课程,我们需要创建一个简单的应用程序,用户在其中填写表单,我们获取数据并将其记录在我们自己的定制SQLite数据库中。我已经成功地完成了表单活动,进行了广泛的错误检查,并使用ContentProvider来处理数据库内容。我差不多完成了,一切正常。我正在努力添加这最后一个要求-在我们让用户提交表单数据之前,我们需要查询数据库并检查他添加的用户名是否已经存在。如果是这样,我们会通知他,不允许更新/创建数据库 他是我的内容提供商提供的一些描述数据库的东西: public fin

我现在正在学习移动编程课程,我们需要创建一个简单的应用程序,用户在其中填写表单,我们获取数据并将其记录在我们自己的定制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)";
在我的活动中,我在submit 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

                }
            }
因此,我的问题是:


我的投影字符串应该是什么样子?我知道我目前使用的字符串是错误的,但我不清楚选择字符串应该是什么?

您的投影是一个
字符串[]
,它将列名作为其元素。它们不应包含有关特定表的任何信息。请注意,Uri的工作是标识表(使用内容提供商的
查询
实现中的
setTable
方法)

您应该将列值放入
字符串[]
中,并让它们替换所选
字符串中的
。这将保护您的数据库免受恶劣的SQL注入

mSelection = COLUMN_USERNAME + "= ?";
mSelectionArgs = new String { "username" };
然后使用

Cursor cur = getContentResolver().query(CONTENT_URI, 
                                        mProjection, 
                                        mSelection, 
                                        mSelectionArgs, 
                                        null);
除非表很小,否则应该确保在单独的线程上执行查询。这将确保UI线程不会被阻塞

SELECT COUNT(*) AS c
FROM tablename
WHERE username = 'Teh us3rer'
LIMIT 1

另外,请确保您在用户名字段上有一个
唯一的
约束,以避免数据竞争。

在我看到您的评论之前更新了我的帖子。这回答了你的问题吗?好的,这很有帮助。最后一件事:我的计划正确吗?哦,我没看到。不,你不是哈哈。嗯,我想有点。。。但不是真的。我会更新我的帖子。好的,我更新了帖子。请注意,Uri包含以下信息:(1)权限(一个应用程序可以有多个内容提供商…权限是必需的,因为内容解析程序将使用它来确定要调用的内容提供商)和(2)要查询的表名(同样,内容提供者可以负责多个SQLite表)。这就是为什么您只需要在投影字符串[]中提供列名。我可以查询,但由于某些原因,我无法阻止用户删除重复的用户名。是否有其他方法让您查看我的代码?我会更新此问题,但我认为应该保留原样
SELECT COUNT(*) AS c
FROM tablename
WHERE username = 'Teh us3rer'
LIMIT 1