【问题标题】:SQLite database queries very slow (SQLite Asset Helper)SQLite 数据库查询非常慢(SQLite Asset Helper)
【发布时间】:2015-12-11 17:34:18
【问题描述】:

我正在开发一个应用程序,萨克斯管演奏者可以在其中选择萨克斯管(女高音、中音、男高音或男中音)。数据库应输出可用于该特定萨克斯管的所有音乐作品,以及作曲家和出版商。 我使用了一个预填充的数据库(使用 SQLite Manager 创建)并使用了 SQLite Asset Helper。 该数据库(到目前为止)有大约 600 条记录。 每当我查询数据库时(比如说在“alto”上),需要大约 10 秒才能找到结果。 我尝试了很多事情:索引(在 db 文件中和在 Java 代码中一样),在 sqlite-file 和 db-file 之间进行更改,在真实设备而不是模拟器等上尝试,等等。 似乎没有任何效果...我希望有人可以帮助我...

我使用两个 java 类:MyDatabase 和 SQLiteOpenHelper。如果您需要更多信息,请告诉我。

MyDatabase class:

    package com.example.musicrepertoiredatabase2;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class MyDatabase extends SQLiteAssetHelper {

    SqliteAssetHelper helper = new SqliteAssetHelper();

    private static final String DATABASE_NAME = "saxophone_repertoire.sqlite";
    private static final String TABLE_NAME = "repertoire";
    private static final int DATABASE_VERSION = 1;

    private static final String ID = "id";
    private static final String COMPOSER = "composer";
    private static final String TITLE = "title";
    private static final String PUBLISHER = "publisher";
    private static final String SAXOPHONE = "saxophone";
    private static final String ACCOMPANIMENT = "form";

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public Cursor getData() {
        SQLiteDatabase db = this.getWritableDatabase();

        String saxSort = SqliteAssetHelper.chooseSax;
        String composer = SqliteAssetHelper.chooseComposer;

        Cursor result = db.rawQuery("SELECT Composer, id FROM " + TABLE_NAME
                + " WHERE " + SAXOPHONE + "='" + saxSort + "'", null);

        return result;

    }
}

我的 SQLiteAssetHelper 类:

    package com.example.musicrepertoiredatabase2;

import android.app.ProgressDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class SqliteAssetHelper extends ActionBarActivity implements
        OnItemSelectedListener, OnClickListener {

    TextView composer, title, saxophone, accompaniment, showInfo, count;
    EditText etComposer, etTitle;
    Spinner spinnerSaxophone, spinnerAccompaniment;
    Button search, clear;
    String[] arraySaxophone = { "Soprano", "Alto", "Tenor", "Baritone" };
    String[] arrayAccompaniment = { "Solo", "Piano" };
    public static String chooseSax = null;
    public static String chooseComposer = null;
    Handler updateBarHandler;

    private MyDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        updateBarHandler = new Handler();

        spinnerSaxophone = (Spinner) findViewById(R.id.spinner_saxophone);
        spinnerSaxophone.setOnItemSelectedListener(this);
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arraySaxophone);
        spinnerSaxophone.setAdapter(adapter1);

        spinnerAccompaniment = (Spinner) findViewById(R.id.spinner_accompaniment);
        spinnerAccompaniment.setOnItemSelectedListener(this);
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arrayAccompaniment);
        spinnerAccompaniment.setAdapter(adapter2);

        etComposer = (EditText) findViewById(R.id.et_composer);
        etComposer.setHint(Html.fromHtml("<small>"
                + getString(R.string.hint_composer) + "<small>"));
        etTitle = (EditText) findViewById(R.id.et_title);
        etTitle.setHint(Html.fromHtml("<small>"
                + getString(R.string.hint_title) + "<small>"));
        search = (Button) findViewById(R.id.btn_search);
        clear = (Button) findViewById(R.id.btn_clear);
        search.setOnClickListener(this);
        clear.setOnClickListener(this);
        showInfo = (TextView) findViewById(R.id.tv_showinfo);
        count = (TextView) findViewById(R.id.tv_count);

        db = new MyDatabase(this);

    }

    public void launchRingDialog() {
        final ProgressDialog ringProgressDialog = ProgressDialog.show(this,
                "Searching database...", "Please wait...", true);

        ringProgressDialog.setCancelable(true);

        new Thread(new Runnable(){

            @Override
            public void run(){
                try{
                    Thread.sleep(5000);
                }catch (Exception e){

                }

                ringProgressDialog.dismiss();
            }
        }).start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position,
            long id) {

        int choosePositionSax = spinnerSaxophone.getSelectedItemPosition();

        switch (choosePositionSax) {
        case 0:
            chooseSax = "Soprano";
            break;
        case 1:
            chooseSax = "Alto";
            break;
        case 2:
            chooseSax = "Tenor";
            break;
        case 3:
            chooseSax = "Baritone";
            break;

        default:
            break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_search:

            launchRingDialog();
            chooseComposer = etComposer.getText().toString();
            Cursor result = db.getData();

            if (result.getCount() == 0) {
                Toast.makeText(this, "Nothing found", Toast.LENGTH_SHORT)
                        .show();
            }
            launchRingDialog();
            StringBuffer buffer = new StringBuffer();
            while (result.moveToNext()) {
                //buffer.append("Title: " + result.getString(2) + "\n");
                buffer.append("Composer: " + result.getString(1) + "\n\n");

                showInfo.setText(buffer);

                int countFiles = result.getCount();
                count.setText(Integer.toString(countFiles));

            }
            break;
        case R.id.btn_clear:
            showInfo.setText("");
            etComposer.setText("");
            etComposer.requestFocus();
            break;
        default:
            break;
        }
    }

}

【问题讨论】:

  • 使用方法跟踪或日志语句来准确确定您将时间花在哪里。
  • 感谢您的建议!我以前没有使用过方法跟踪,但我认为现在是深入研究它的好时机! ;-)

标签: android mysql database sqlite


【解决方案1】:

你必须等待 5 秒,为什么 =)?

  Thread.sleep(5000);

删除这一行,你的查询会更快!

我看到您在代码中声明了两次launchRingDialog(),因此您必须等待10 seconds。您的查询应持续不超过毫秒,因此您可能不需要任何ProgressDialog

【讨论】:

  • 嗯,生活有时可以如此简单...... ;-) 我认为睡眠线程只影响了 launchRingDialog 的持续时间。我运行了该程序,它是否更快。然而,在显示“中音”结果之前仍然需要大约 5-6 秒。我想我会尝试 CommonsWare 建议的方法跟踪。
  • 是的,但让我告诉你一个秘密,几年前我也做过同样的事情! =P.
  • 很抱歉再次“打扰”您...我的查询仍然很慢。选择 'alto' 选项仍然需要大约 8 秒才能显示结果。其他选项(女高音,男高音,男中音)就像一个魅力......我重建了数据库,重建了完整的应用程序,尝试了方法跟踪,但似乎没有任何帮助......我希望你能...... :-)跨度>
【解决方案2】:

我建议为您的表添加一个索引:

Create Index IF NOT EXISTS _index_saxophone  on T_ResultsSummary(saxophone);

【讨论】:

  • 我已经尝试过索引,但说实话:我不知道将索引代码放在哪里。我是把它放在我在 SQLite 管理器中创建的数据库文件中,还是把它放在 Java 代码中?如果我要把它放在 Java 代码中,放在哪里......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多