【发布时间】:2018-10-28 09:08:28
【问题描述】:
我想将ArrayList<CustomClass>-object 保存到 Android 存储中的某个位置,以便快速检索并在其中显示数据。
这可能吗?如果是,那么哪种技术更合适,SQLite 还是外部存储?
【问题讨论】:
-
为什么不使用android中提供的sharepreferences?
我想将ArrayList<CustomClass>-object 保存到 Android 存储中的某个位置,以便快速检索并在其中显示数据。
这可能吗?如果是,那么哪种技术更合适,SQLite 还是外部存储?
【问题讨论】:
例子。
public class MyClass implements Serializable
{
private static final long serialVersionUID = 1L;
public String title;
public String startTime;
public String endTime;
public String day;
public boolean classEnabled;
public MyClass(String title, String startTime, boolean enable) {
this.title = title;
this.startTime = startTime;
this.classEnabled = enable;
}
public boolean saveObject(MyClass obj) {
final File suspend_f=new File(SerializationTest.cacheDir, "test");
FileOutputStream fos = null;
ObjectOutputStream oos = null;
boolean keep = true;
try {
fos = new FileOutputStream(suspend_f);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
} catch (Exception e) {
keep = false;
} finally {
try {
if (oos != null) oos.close();
if (fos != null) fos.close();
if (keep == false) suspend_f.delete();
} catch (Exception e) { /* do nothing */ }
}
return keep;
}
public MyClass getObject(Context c) {
final File suspend_f=new File(SerializationTest.cacheDir, "test");
MyClass simpleClass= null;
FileInputStream fis = null;
ObjectInputStream is = null;
try {
fis = new FileInputStream(suspend_f);
is = new ObjectInputStream(fis);
simpleClass = (MyClass) is.readObject();
} catch(Exception e) {
String val= e.getMessage();
} finally {
try {
if (fis != null) fis.close();
if (is != null) is.close();
} catch (Exception e) { }
}
return simpleClass;
}
并从活动中调用
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject");
else
cacheDir= getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
MyClass m = new MyClass("umer", "asif", true);
boolean result = m.saveObject(m);
if(result)
Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show();
MyClass m = new MyClass();
MyClass c = m.getObject(this);
if(c!= null)
Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show();
不要忘记在清单文件中使用 write_external_storage 权限。
【讨论】:
这个问题并不是真正的 android 特定的。我的意思是如果你知道如何通过 java.io.Serializable 序列化你的数据或者你有一个自定义的持久化格式,你只需要知道在哪里存储它。
您可以通过
在本地设备上抓取文件FileOutputStream stream = null;
try{
stream = mContext.openFileOutput("name.data", Context.MODE_PRIVATE);
ObjectOutputStream dout = new ObjectOutputStream(stream);
dout.writeObject(myArrayList);
dout.flush();
stream.getFD().sync();
} catch(IOException e) { //Do something intelligent
} finally {
stream.close();
}
稍后您将不得不使用 openFileInput() 来读回数据。
或者您可以获取外部存储。这很相似,但是您必须保证它甚至存在。就像是连接的外部存储,甚至可以写入。由于您在这里编写数据结构并且通常外部存储是世界可读的,因此我认为这对于您的预期目的来说不是一个好主意(仅从您到目前为止的内容来看)。
如果您的数据是结构化的并且将被多次查询并且总是加载可能相当大,那么请考虑使用作为操作系统一部分的 sql lite 工具。但是我假设你也不需要这个,因为一个简单的列表就是一个线性结构,你可以在文件中寻找它(假设它小于 1MB 的数据:)
【讨论】: