在我的学习过程中,我想关注下一刻:Android/手机固件中到底是哪个?框架?系统库?生成 SQL 命令是为了处理最终用户软件的程序代码。 我现在必须理解并弄清楚的纯示例 - 如何使用联系人提供程序中的 SQL 命令运行以下程序代码:
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
ContentResolver resolver = context.getContentResolver();
try (Cursor cursor = resolver.query(uri, PROJECTION, null, null, null)) {
.....
}
简单来说:在Android Studio的控制台/Logcat中我想找到类似的内容: “选择...从phone_lookup内部连接...在...哪里...排序依据...” 我正在使用与最新 Android Studio 捆绑在一起的官方模拟器:Pixel_3a_API_30_x86.avd“智能手机” - 因此使用 root 命令来实现此目标应该不难。现在我无法得到它。我已经尝试过接下来的电话:
adb shell setprop log.tag.SQLiteLog VERBOSE
adb shell setprop log.tag.SQLiteStatements VERBOSE
adb shell setprop db.log.slow_query_threshold 0
and next:
adb root
adb shell stop
adb shell start
没有结果。因此我的问题是 - 我必须如何、什么以及在哪里使用/调用/设置/创建/删除,以便查看在 Android 体内执行/生成的所有内部 SQL 命令 - 在其所有内部库/插件/等内部。换句话说,在手机上为最终用户的软件创建整个 Android 工作环境的一切都在其中。
好吧,像往常一样 - 如果你想做某事 - 只能自己做)))
try (Cursor cursor = resolver.query(uri, PROJECTION, null, null, null))
如果在此命令行中输入最后一个参数 100% 错误字符串 - 例如“LIKE蕉” - 在执行阶段我们将收到错误“android.database.sqlite.SQLiteException:靠近“bananas”:语法错误(代码1)” 以及相应的 staсktrace,其中还包括完整的 SQL 命令 - 在其中发现了该错误。 因此,我们可以很容易地获得知识 - 通过 WHICH EXACTLY SQL 请求正在发出特定的 URI 请求。而且它可以在真正的手机上运行!因此我们可以很容易地理解 - 以及为什么突然我们无法访问特定的数据列,该数据列似乎存在于查询结果中(根据开发人员的在线帮助),但由于某些原因在某些模型上他们没有电话。现在它变得更容易理解 - 以及如何在“堆栈跟踪的精确 SQL”作为参考的基础上重写您的请求 - 但保证在执行时获得必要的数据!
使用这些道具时:
adb shell setprop log.tag.SQLiteLog VERBOSE
adb shell setprop log.tag.SQLiteStatements VERBOSE
adb shell setprop db.log.slow_query_threshold 0
and next:
adb root
adb shell stop
adb shell start
您将通过执行“adb logcat”然后调用设备上的代码流来看到结果。查询将在日志中可见。