При запуске я считываю данные, выполняю различные проверки, а затем просматриваю данные, чтобы очистить их. После этого приложение запускается.
Теперь я могу сделать одну вещь: как только данные будут очищены, я смогу сериализовать() объект таблицы, а в следующий раз просто прочитать его обратно. Хорошо, но я по-прежнему отправляю необработанные (беспорядочные) данные в приложение. Было бы лучше сериализовать() данные только один раз, при создании apk (на моем компьютере), а затем просто десериализовать() их из «ресурса» в APK (например, через путь к классам
Код: Выделить всё
InputStream stream = res.openRawResource(R.raw.sterilised_object_name))
----ANS По сути (я надеюсь), что предложил @commonsware ---
Хорошо, я не вижу возможности дать ответ на этом «форуме», поэтому включу ответ здесь:
Итак, я извлек код из приложения Android, которое читало плоские файлы, выполняло очистку
и сохраняло все в TreeMap. Теперь он работает под обычной оболочкой, мы просто
используем пути доступа к файлам Linux, а не ресурсы Android.
Обработку ошибок можно было бы улучшить, но она запускается только (один раз)
разработчиком, и полученный файл встраивается в приложение. Процитируем
оригинальный файл cookie Fortune(1): «Опытный пользователь обычно знает, что делать»
... в конце main() я добавил...
Код: Выделить всё
data_processor.serialize();
if (data_processor.verify())
System.err.println("Serialised data verified OK, data can be found at " + SERIAL_FILE);
else
System.err.println("Serialised data failed to verify");
Код: Выделить всё
void serialize() {
try {
FileOutputStream f = new FileOutputStream(SERIAL_FILE);
ObjectOutput s = new ObjectOutputStream(f);
s.writeObject(map); // Ourselves
} catch (FileNotFoundException e) {
System.err.println("File Not found in serialize: " + e);
} catch (IOException e) {
System.err.println("IO Error in serialize: " + e);
}
}
T readAnObject(ObjectInputStream in, Class clazz) throws IOException, ClassNotFoundException {
Object obj = in.readObject(); // Reads as Object
if (clazz.isInstance(obj)) { // Runtime check (optional but good practice)
return clazz.cast(obj); // Safe cast using the Class object
} else {
throw new ClassCastException("Deserialized object is not of type " + clazz.getName());
}
}
// Deserialise map and verify that it matches the one we wrote out
boolean verify() {
boolean ok = true;
try {
FileInputStream in = new FileInputStream(SERIAL_FILE);
ObjectInputStream s = new ObjectInputStream(in);
// Dammit, it is checked. Due to type erasure we only have the basic type (TreeMap) at runtime
@SuppressWarnings("unchecked")
TreeMap new_map = readAnObject(s, TreeMap.class);
System.err.println("After deserialise, new map has " + new_map.size() + " entries");
// Now check all the fields match
int new_key = new_map.firstKey();
for(Map.Entry entry : map.entrySet()) {
int key = entry.getKey();
Golddatum o = entry.getValue(); // old , the original data
Golddatum n = new_map.get(new_key); // new , the deserialised data
if (! is_equal(o, n)) {
System.err.println("Error deserialised data differs: ");
ok = false;
System.exit(1); // One error is enough
} // if is_equal
Integer new_key_object = new_map.higherKey(new_key);
if (new_key_object == null)
new_key = 0; // This had better be the last time around the loop, because n (new) has run out of data. We set to zero so if any more compare are done, they will fail.
else
new_key = new_key_object;;
} // for
} catch (ClassNotFoundException e) {
System.err.println("Class (TreeMap) not found in serialized data" + e);
} catch (FileNotFoundException e) {
System.err.println("File Not found in serialize" + e);
} catch (IOException e) {
System.err.println("IO Error in serialize" + e);
}
return ok;
}
Затем в приложении Android:
Экспортированный сериализованный файл находится в папке:
.../app/src/main/res/raw/gold_treemap
и какой-то очень знакомый код:
Код: Выделить всё
// Deserialize map from disk
boolean deserialise_treemap(MainActivity frame) {
boolean ok = true;
try {
Resources res = frame.getResources();
InputStream in = res.openRawResource(R.raw.gold_treemap);
ObjectInputStream s = new ObjectInputStream(in);
// Dammit, it is checked. Due to type erasure we only have the basic type (TreMap) at runtime
map = this.readAnObject(s, TreeMap.class);
Gold.new_map_size = map.size();
Подробнее здесь: https://stackoverflow.com/questions/798 ... -advisable
Мобильная версия