数据库与列表

时间:2011-09-01 17:51:08

标签: android mysql list

我正在开发一个Android应用.. 我希望有一个大约1000字符串的存储空间..我开始使用mysql但发现它很难,所以我现在使用列表......那会有太大的区别还是没关系?

5 个答案:

答案 0 :(得分:3)

SQLLite是一个很好的解决方案,但它会产生更大的数据占用空间(您的应用程序将占用更多空间)。您将在SQLLite中找到的问题是您需要执行以下操作之一:

1。)启动时,在第一次运行时手动读入SQLlite数据库的值列表以进行设置并使其运行以供后续使用(慢速),这样您就可以设置数据并使其可用

2.。)将SQLlite数据库的副本作为文件添加到已预先填充了值的应用程序安装中(有点烦人,想知道如何在Android中执行此操作)。有几个关于如何做到这一点的在线教程。

如果您所做的只是使用1000个字符串的列表并查找字符串,您可能希望使用.CSV并将其读入HashMap。与Android中的SQLLite(和更小版本)相比,HashMap更快更容易使用。您还可以对磁盘进行序列化和反序列化,并将其作为Android资源文件夹中的预序列化对象包含在内,以加快速度。如果您正在做的就是1000个字符串,那么搜索的数据就不多了。

* EXTRA CREDIT *

这是一个可爱的类,可以为您执行磁盘的所有序列化和反序列化:

package com.example;

import android.app.Activity;
 android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.TextView;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class MyActivity extends Activity
{
public  final String DICTIONARY_FILE_NAME = "dictionarys.ser";
private TextView myLabel;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    writeToFile();
    //writeToSDCard();

   /*  */

     readFile();
}

private void readFile()
{
    try
    {
        Map data = null; //object to be deserialized
        InputStream is = null;
        ObjectInputStream ois=null;
        AssetManager assets = getAssets();
        is = assets.open(DICTIONARY_FILE_NAME);
        ois = new ObjectInputStream(is);
        data = (Map) ois.readObject();
        ois.close();
    }
    catch (Exception e){
        Log.v(e.getMessage(), "message");
    }

}

private void writeToFile()
{
         //read the csv into the new database
     //this requires there to be a dictionary.csv file in the raw directory
    InputStream inputStream = getResources().openRawResource(R.raw.dictionary);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

    try
    {
       String word;//word
       int primaryKey = 0;//primary key
       Map dictionaryHash = new HashMap();

       while ((word = reader.readLine()) != null)
       {
           dictionaryHash.put(primaryKey,word );
           primaryKey++;

           if(primaryKey % 1000 == 0)
           {
               Log.v("Percent load completed ", " " + primaryKey);
               myLabel.setText("Percent load completed " + primaryKey);
           }
       }

        //write the dictionary to a file
        File file = new File(DICTIONARY_FILE_NAME);
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(getFilesDir() +"/"+ DICTIONARY_FILE_NAME));
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(dictionaryHash);
        oos.flush();
        oos.close();


        //FileInputStream fis = new FileInputStream(getFilesDir() +"/"+DICTIONARY_FILE_NAME);
        //ObjectInputStream ois = new ObjectInputStream(fis);
        //Map dictionaryMap = (Map) ois.readObject();

        //ois.close();

   }
   catch (Exception ex) {
       // handle exception
       Log.v(ex.getMessage(), "message");
   }
   finally
    {
       try
       {
           inputStream.close();

       }
       catch (IOException e) {
           // handle exception
          Log.v(e.getMessage(), "message");
       }
   }

}

private void writeToSDCard()
{
    //this requires there to be a dictionary.csv file in the raw directory
    InputStream inputStream = getResources().openRawResource(R.raw.dictionary);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

    try
    {
       String word;//word
       int primaryKey = 0;//primary key
       Map dictionaryHash = new HashMap();

       while ((word = reader.readLine()) != null)
       {
           if(word.length() < 7)
           {
               dictionaryHash.put(primaryKey,word );
               primaryKey++;



               if(primaryKey % 1000 == 0)
                   Log.v("Percent load completed ", " " + primaryKey);
           }
       }

        //write the dictionary to a file
        File file = new File(DICTIONARY_FILE_NAME);
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory() +"/"+ DICTIONARY_FILE_NAME));
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(dictionaryHash);
        oos.flush();
        oos.close();
                 Log.v("alldone","done");
          /*
        FileInputStream fis = new FileInputStream(getFilesDir() +"/"+DICTIONARY_FILE_NAME);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Map dictionaryMap = (Map) ois.readObject();
        ois.close();  */

   }
   catch (Exception ex) {
       // handle exception
       Log.v(ex.getMessage(), "message");
   }
   finally
    {
       try
       {
           inputStream.close();

       }
       catch (IOException e) {
           // handle exception
          Log.v(e.getMessage(), "message");
       }
   }
}

}

答案 1 :(得分:1)

这完全取决于您打算如何使用它们,以及您正在使用的列表类型。例如,如果这些是需要不断记忆的东西,那么将它们作为列表更有意义。如果这些是实际搜索所需的内容,那么您可能需要一个数据库。

顺便说一下,SQLLite更快,但SQL是SQL,它有很多与MySQL相同的语法。

另外一点:小心你正在使用哪个列表。 LinkedList需要很长时间才能在List的末尾查找实体,而ArrayList在插入时偶尔会有额外的开销。当然,如果您能够存储常量引用的所有内容,那么您可能需要考虑HashMap或HashTable - HashMap非常容易理解。

答案 2 :(得分:1)

不要预先优化。 (另见Premature Optimization

直到您知道,或者可以合理地估计存储方法“太慢”,不要担心。让应用程序正常运行,然后查看您关注的区域是否真的成为瓶颈。

1000个字符串确实不是很多(除非每个字符串都是Dostoyevsky book的长度)。

如果您已经在编译时知道字符串(听起来像这样),您可以将它们加载到arrays.xml文件中,该文件在构建时包含在您的应用程序中。

答案 3 :(得分:0)

您甚至可以使用字符串数组,并将数据存储在资源中。

答案 4 :(得分:0)

This link对于理解SQLite for android可能非常有帮助。