Android - 在SQLite数据库中搜索数据的最快方法

时间:2015-10-23 23:11:24

标签: java android sqlite

我有一个图像处理应用程序。我的应用程序将已处理的图像存储在数据库中。每次用户打开应用程序时,应用程序都会开始检查数据库以查看已处理的照片。使用我的代码,这个过程大约需要10-20秒,这对我来说需要很多时间。 数据库只有一列,即图像的路径。我从手机中获取完整的图像列表,然后搜索数据库中列表的每个项目。

我的代码如下:

[RegularAttribute("Dont_turn_me_on_yet")]
public class MyClass
{
    public int Value { get; set; }

    [SpecialAttribute("On_RightAway_Please")]
    public void MethodOne(){}

    [RegularAttribute("Dont_turn_me_on_yet")]
    public void MethodTwo(){}
}

static void Main()
{
   var mc = new MyClass(); //SpecialAttribute constructor is called right away, but not RegularAttribute
}

3 个答案:

答案 0 :(得分:3)

对于要检查的每个文件,您正在执行单独的sqlite查询。难怪它很慢!如果有100个文件,则需要进行100次查询。但这可以通过一个简单的查询来完成。您只需要将两种方法合并为1

if-else

这是一个循环,一个查询。我不知道你的照片阵列列表来自哪里,但我觉得那里还有进一步优化的空间。

答案 1 :(得分:2)

几乎所有sql(Sqlite,MySql,....)速度问题的答案是在表上创建索引。请参阅:https://www.sqlite.org/lang_createindex.html 我猜你在你刚刚添加的imgFile上进行全表扫描,就像它得到的那样慢。

你可以做的其他事情(但不像指数那样获得帮助) 1)由于您没有使用从Sqlite返回的imgFile,请将您的sql更改为'Select count() From ... ',如果存在,将返回大于零的整数。

2)在select语句"Select .... limit 1;"中添加一个limit子句这将允许Sqlite在找到第一条记录后返回。

答案 2 :(得分:0)

您已经以评论的形式获得了回复!

首先是循环问题,如e4c5所示。当然,这将带来巨大的推动。

第二个是SELECT * FROM table替换为SELECT field1WhatIreallyNeed, field2WhatIreallyNeed FROM table

它还有助于添加索引Where字段。

我已经将sqlite3与NDK集成在一起,因此它在那里使用了C,甚至更快,但是如果你的记录在1个表中接近100万则值得。

最好的答案是评论:你不需要数据库!这将是最快的。想想数据库是如何读取的,存储在哪里? - 在一个文件中,只有另一个约束,解析,处理开销。

  

我需要数据库,因为我的应用程序会覆盖原始照片,所以   照片总是存在

不,你不需要数据库!

eTags

有一个元文件信息

您可以存储在单独的文件downloaded_timestampprocessed_timestamp中,您可以计算是否需要处理,这需要几毫秒而不是10-20秒。

因此,删除数据库并使用一个简单的文件,一次性读取该文件中的数据,而不是逐行读取。