2016-07-03 2 views
1

В моем приложении некоторые данные передаются в устройство с отметкой времени, поэтому я сохраняю его в структуре Hashtable. Если пользователь желает, он также сохраняется в хранилище для последующего просмотра или отправки по электронной почте в виде файла CSV. Это отлично работает на устройствах iOS и двух разных (не Samsung) брендах Android-устройств под управлением 4.4 и 6.0. Он не работает на Samsung Galaxy S4, работающем 5.0.1.Codename One Сохранение на Samsung Galaxy S4

Программа работает следующим образом, после того, как пользователь нажимает кнопку остановки, следующий метод называется:

public void stopLogging() { 
    isLogging = false; 
    dataStorage.flushStorageCache(); 
    dataStorage.writeObject(fileName, dataLogValues); 
    dataLogValues.clear(); 
} 

dataLogValues ​​является Hashtable.

Когда пришло время доступа к зарегистрированным данным, список доступных имен файлов собирается с помощью кнопок, позволяющих получить доступ к определенному журналу.

public String[] getLogList() { 
    return dataStorage.listEntries(); 
} 

Где dataStorage ранее инициализируется в конструкторе

dataStorage = Storage.getInstance(); 

Когда журнал выбран из String [] из записей хранения, следующий метод вызывается для извлечения файла:

public Hashtable<Long, Integer> getLog(String logName) { 
    dataStorage.clearCache(); 
    Hashtable<Long, Integer> log = (Hashtable<Long, Integer>) dataStorage 
      .readObject(logName); 
    return log; 
} 

На устройстве Samsung я добавил диалоговое окно для отображения каждого имени файла журнала, когда я перебираю строки в именах строк, и получаю только следующее:

"rList- (полное название пакета) .RallyPacControlStub", где RallyPacControl - это имя приложения. Если я также показываю размер строки [], я получаю ожидаемое количество записей для того, сколько журналов я сохранил. Вот код, в котором я обрабатываю записи журнала, и избегаю файлов, которые я не хочу. Файлы журналов, созданные для этого, называются только строкой времени/даты, обозначающей время создания.

String[] logList = dataBuffer.getLogList(); 
    for (int i = 0; i < logList.length; i++) { 
     Dialog.show("Log name", logList[i], "OK", null); 
     if (!logList[i].equalsIgnoreCase("Cookies") 
       && !logList[i].startsWith("CN1") 
       && !logList[i].equals("Infopage") 
       && !logList[i].startsWith("Chart") 
       && !logList[i].startsWith("Log")) { 
      String log = logList[i]; 
      Container buttonContainer = new Container(); 
      buttonContainer.setUIID("LogButtonContainer"); 
      buttonContainer.setName("LogListContainer"); 
      buttonContainer.setLayout(new BoxLayout(BoxLayout.X_AXIS)); 
      buttonContainer.add(new ShowLogButton(log, dataBuffer 
        .getLog(logList[i]))); 
      buttonContainer.add(new ExportLogButton((logList[i]))); 
      buttonContainer.add(new LogDeleteButton(log, this)); 
      logsContainer.add(buttonContainer); 
     } 
    } 
+0

В 9 из 10 случаев, подобных этому, проблема связана с пользователями, ожидающими 'getClass(). GetName()' для возврата допустимого значения. Ничто из этого не кажется релевантным для проблемы, поскольку вы не показываете какой-либо код, который обращается к хранилищу, и даже то, как сбой хранилища, не очень ясен. –

+0

Я не уверен, что вы имеете в виду, я показал весь код, который обращается к хранилищу. Переменная dataStorage содержит ссылку на Storage.getInstance(). Я использую методы writeObject и readObject для хранения и извлечения. Я использую listEntries для получения списка имен файлов. На большинстве устройств после этого массив String, возвращаемый listEntries, имеет ожидаемые ключи, которые использовались для помещения элементов в хранилище. На устройстве Samsung я получил результат, о котором я говорил выше. Я не знаю, как создавать приложения для Android из источников, но я думаю, мне нужно попробовать, чтобы лучше узнать, что происходит. –

+0

Похоже, что я могу обойти эту проблему, добавив известный префикс к имени файла, а затем только используя элементы из хранилища с этим префиксом. –

ответ

1

Должно быть, я пропустил линии с Hashtable чтения. Возможно, устройство Samsung имеет скрытый файл в иерархии, чтобы указать метаданные файловой системы, которые могут быть доступны вам, поэтому использование префикса файла обычно является хорошей идеей.

Возможно также, что это файл из API Log.p(), который записывается в это место. Обратите внимание, что API Storage не гарантирует возврата только файлов, которые вы записываете в хранилище.

Смежные вопросы