我正在开发一个Android应用.. 我希望有一个大约1000字符串的存储空间..我开始使用mysql但发现它很难,所以我现在使用列表......那会有太大的区别还是没关系?
答案 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可能非常有帮助。