Android 正在检查DB应用程序中是否存在电话号码

Android 正在检查DB应用程序中是否存在电话号码,android,sqlite,phone-number,Android,Sqlite,Phone Number,在我的db manager类中,我有一个检查db中是否存在某个电话号码的函数: public boolean is_phone_number_exist_in_group(String phone_num, int group_id) { SQLiteDatabase db = db_helper.getReadableDatabase(); Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACT

在我的db manager类中,我有一个检查db中是否存在某个电话号码的函数:

public boolean is_phone_number_exist_in_group(String phone_num, int group_id)
{
    SQLiteDatabase db = db_helper.getReadableDatabase();

    Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACTS, null, 
            "group_id="+group_id+" AND contact_phone="+phone_num, null, null, null, null);

    if(mContactsCursor.moveToFirst())
    {
        mContactsCursor.close();
        db.close();
        return true;
    } else {
        mContactsCursor.close();
        db.close();
        return false;
    }

}
现在我只想将结果输出到logcat:

Log.i(DEBUG_TAG, "Is Phone number exist: "+manager.is_phone_number_exist_in_group(contact_phone, group_id));
但是当我运行应用程序时,它在这一部分崩溃了。这是我在logcat中得到的输出:

09-27 07:55:02.284: E/AndroidRuntime(20602): FATAL EXCEPTION: main
09-27 07:55:02.284: E/AndroidRuntime(20602): java.lang.RuntimeException: 
    Failure delivering result ResultInfo{who=null, request=0, result=-1, 
    data=Intent { dat=content://com.android.contacts/contacts/lookup/0r5-49434B2F3D374D4D3D2F/5 flg=0x1 }} 
    to activity {com.myinfo.myapp/com.myinfo.myapp.activities.Activity_Group_Contacts}: 
    android.database.sqlite.SQLiteException: near "444": syntax error: , 
    while compiling: SELECT * FROM group_contacts WHERE group_id=1 
    AND contact_phone=(052) 444-5556
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread.access$1100(ActivityThread.java:123)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.os.Looper.loop(Looper.java:137)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread.main(ActivityThread.java:4424)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at java.lang.reflect.Method.invokeNative(Native Method)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at java.lang.reflect.Method.invoke(Method.java:511)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at dalvik.system.NativeStart.main(Native Method)
09-27 07:55:02.284: E/AndroidRuntime(20602): Caused by: 
    android.database.sqlite.SQLiteException: near "444": syntax error: , while 
    compiling: SELECT * FROM group_contacts WHERE group_id=1 AND 
    contact_phone=(052) 444-5556
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1449)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1485)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at com.myinfo.myapp.tasks.Task_DB_Manager.is_phone_number_exist_in_group(Task_DB_Manager.java:170)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at com.myinfo.myapp.activities.Activity_Group_Contacts.add_new_contact(Activity_Group_Contacts.java:326)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at com.myinfo.myapp.activities.Activity_Group_Contacts.onActivityResult(Activity_Group_Contacts.java:171)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.Activity.dispatchActivityResult(Activity.java:4649)
09-27 07:55:02.284: E/AndroidRuntime(20602):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
09-27 07:55:02.284: E/AndroidRuntime(20602):    ... 11 more
09-27 07:55:02.284:E/AndroidRuntime(20602):致命异常:main
09-27 07:55:02.284:E/AndroidRuntime(20602):java.lang.RuntimeException:
未能传递结果ResultInfo{who=null,request=0,result=-1,
数据=意图{dat=content://com.android.contacts/contacts/lookup/0r5-49434B2F3D374D4D3D2F/5 flg=0x1}
到活动{com.myinfo.myapp/com.myinfo.myapp.activities.activity\u Group\u Contacts}:
android.database.sqlite.SQLiteException:靠近“444”:语法错误:,
编译时:从组\u id=1的组\u联系人中选择*
联系电话=(052)444-5556
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)上
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.ActivityThread.access$1100(ActivityThread.java:123)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.os.Handler.dispatchMessage(Handler.java:99)上
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.os.Looper.loop(Looper.java:137)上
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.app.ActivityThread.main(ActivityThread.java:4424)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于java.lang.reflect.Method.Invokenactive(本机方法)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于java.lang.reflect.Method.invoke(Method.java:511)
09-27 07:55:02.284:E/AndroidRuntime(20602):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-27 07:55:02.284:E/AndroidRuntime(20602):在dalvik.system.NativeStart.main(本机方法)
09-27 07:55:02.284:E/AndroidRuntime(20602):由以下原因引起:
android.database.sqlite.SQLiteException:靠近“444”:语法错误:,而
编译:从组id=1的组联系人中选择*并
联系电话=(052)444-5556
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteCompiledSql.native_编译(本机方法)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:68)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:127)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:94)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:53)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1449)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405)
09-27 07:55:02.284:E/AndroidRuntime(20602):位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1485)
09-27 07:55:02.284:E/AndroidRuntime(20602):在com.myinfo.myapp.tasks.Task\u DB\u Manager.is\u phone\u number\u exist\u in_group(Task\u DB\u Manager.java:170)
09-27 07:55:02.284:E/AndroidRuntime(20602):在com.myinfo.myapp.activities.Activity\u Group\u Contacts.添加新联系人(Activity\u Group\u Contacts.java:326)
09-27 07:55:02.284:E/AndroidRuntime(20602):在com.myinfo.myapp.activities.Activity\u Group\u Contacts.onActivityResult(Activity\u Group\u Contacts.java:171)
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.Activity.dispatchActivityResult(Activity.java:4649)上
09-27 07:55:02.284:E/AndroidRuntime(20602):在android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
09-27 07:55:02.284:E/AndroidRuntime(20602):。。。还有11个
我的猜测是,虽然我不确定——这是因为电话号码的444部分附近有空格或连字符


如何修复并使其工作?

您只是缺少电话号码周围的引号:

Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACTS, null, 
            "group_id="+group_id+" AND contact_phone='"+phone_num+"'", null, null, null, null);

您只是缺少电话号码周围的引号:

Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACTS, null, 
            "group_id="+group_id+" AND contact_phone='"+phone_num+"'", null, null, null, null);

SQL查询需要对某些字符进行转义

为了避免担心转义(以及sql注入),请始终使用
selectionArgs
。SQLite将正确地转义它们。它还允许
SQLite
识别您的查询以优化它们

像这样使用:

String query = "group_id = ? AND contact_phone = ?";
String[] args = new String[] { Integer.toString(group_id), phone_num };
Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACTS, null, 
        query, args, null, null, null);

SQL查询需要对某些字符进行转义

为了避免担心转义(以及sql注入),请始终使用
selectionArgs
。SQLite将正确地转义它们。它还允许
SQLite
识别您的查询以优化它们

像这样使用:

String query = "group_id = ? AND contact_phone = ?";
String[] args = new String[] { Integer.toString(group_id), phone_num };
Cursor mContactsCursor = db.query(Constants.TABLE_NAME_GROUP_CONTACTS, null, 
        query, args, null, null, null);

短期内容易解决,但从长远来看,使用selectionargs是推荐的方法是的,Igal现在可以在这两个选项之间做出决定:)短期内容易解决,但从长远来看,使用selectionargs是推荐的方法是的,Igal可以在这两个选项之间做出决定