0

Я искал это, но я не получил ответа. Я работаю над Бюджетным приложением и в нем есть два типа баз данных (Sqlite и Shared-preferences). Поскольку я могу BACKUP/RESTORE базы данных sqlite в sdcard, но я не знаю, как сделать резервную копию и восстановить базу данных общих настроек.Как восстановить Android Sharedpreferences из файла XML после создания резервной копии на SD-карте?

Я могу создать резервную базу данных общих настроек, но не знаю, как ее восстановить с SD-карты.
Базы данных имен: 1.magicbox_database.db является SQLite базы данных, 2.magicbox_database_sf.db является sharedpreferences база

Это код для резервного копирования как для базы данных.

if (isStoragePermissionGranted() == true) { 
        try { 
         File sd = Environment.getExternalStorageDirectory(); 
         if (sd.canWrite()) { 
          String currentDBPath = "/data/data/" + getPackageName() + "/databases/OLBE_DEMO"; 
          String backupDBPath = "magicbox_database.db"; 
          File currentDB = new File(currentDBPath); 
          File backupDB = new File(sd, backupDBPath); 
          Toast.makeText(MainActivity.this, "backup creating....", Toast.LENGTH_SHORT).show(); 
          if (currentDB.exists()) { 
           FileChannel src = new FileInputStream(currentDB).getChannel(); 
           FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
           dst.transferFrom(src, 0, src.size()); 
           src.close(); 
           dst.close(); 
           Toast.makeText(MainActivity.this, "Bckup Created !", Toast.LENGTH_SHORT).show(); 
           Toast.makeText(MainActivity.this, "magicbox_database.db in External Storage", Toast.LENGTH_SHORT).show(); 
          } 


          String currentDBPath1 = "/data/data/" + getPackageName() + "/shared_prefs/DATABASE.xml"; 
          String backupDBPath1 = "magicbox_database_sf.xml"; 
          File currentDB1 = new File(currentDBPath1); 
          File backupDB1 = new File(sd, backupDBPath1); 
          // Toast.makeText(MainActivity.this, "backup creating....", Toast.LENGTH_SHORT).show(); 
          if (currentDB1.exists()) { 
           FileChannel src1 = new FileInputStream(currentDB1).getChannel(); 
           FileChannel dst1 = new FileOutputStream(backupDB1).getChannel(); 
           dst1.transferFrom(src1, 0, src1.size()); 
           src1.close(); 
           dst1.close(); 
           //Toast.makeText(MainActivity.this, "Bckup Created !", Toast.LENGTH_SHORT).show(); 
           Toast.makeText(MainActivity.this, "magicbox_database_sf.db in External Storage", Toast.LENGTH_SHORT).show(); 
          } 

         } 
        } catch (Exception e) { 
         Toast.makeText(MainActivity.this, "ERROR! backup not created", Toast.LENGTH_SHORT).show(); 
        } 
       } 

Этот код для восстановления обоих

if (isStoragePermissionGranted() == true) { 
        try { 
         File sd = Environment.getExternalStorageDirectory(); 
         if (sd.canWrite()) { 
          String currentDBPath = "/data/data/" + getPackageName() + "/databases/OLBE_DEMO"; 
          String backupDBPath = "magicbox_database.db"; 
          File currentDB = new File(currentDBPath); 
          File backupDB = new File(sd, backupDBPath); 
          Toast.makeText(MainActivity.this, "restoring......", Toast.LENGTH_SHORT).show(); 
          if (currentDB.exists()) { 
           FileChannel src = new FileInputStream(backupDB).getChannel(); 
           FileChannel dst = new FileOutputStream(currentDB).getChannel(); 
           dst.transferFrom(src, 0, src.size()); 
           src.close(); 
           dst.close(); 
           Toast.makeText(MainActivity.this, "Your data Restored !", Toast.LENGTH_SHORT).show(); 
          } 
          String currentDBPath1 = "/data/data/" + getPackageName() + "/shared_prefs/DATABASE.xml"; 
          String backupDBPath1 = "magicbox_database_sf.xml"; 
          File currentDB1 = new File(currentDBPath1); 
          File backupDB1 = new File(sd, backupDBPath1); 
          if (currentDB1.exists()) { 
           FileChannel src1 = new FileInputStream(backupDB1).getChannel(); 
           FileChannel dst1 = new FileOutputStream(currentDB1).getChannel(); 
           dst1.transferFrom(src1, 0, src1.size()); 
           src1.close(); 
           dst1.close(); 
           Toast.makeText(MainActivity.this, "magicbox_database_sf.db in External Storage", Toast.LENGTH_SHORT).show(); 
          } 
         } 

        } catch (Exception e) { 
         Toast.makeText(MainActivity.this, "ERROR! data not restored", Toast.LENGTH_SHORT).show(); 
        } 
       } 

изменения в этом коде

FileChannel src1 = new FileInputStream(backupDB1).getChannel(); 
FileChannel dst1 = new FileOutputStream(currentDB1).getChannel(); 
+0

magicbox_database_sf.db - база данных sharedpreferences - что это за м ean? – shadygoneinsane

+0

Shared Pref - это пары ключевых значений !!! – shadygoneinsane

+1

@shadygoneinsane magic_database_sf.db - это имя базы данных, которую я сохраняю в SDCARD –

ответ

1

Да только затем this, чтобы получить путь к файлу и XML может быть легко извлечены с все ваши предпочтения - тогда вы можете использовать этот xml-контент (путем его разбора) для создания настроек или извлечения значений

XML будет выглядеть примерно так:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <int name="Key2" value="100" /> 
    <long name="Key1" value="99" /> 
    <string name="Key">Vikesh Dass</string> 
</map> 

Просто разобрать XML, чтобы получить данные, это должно быть легко :)

для парсинга Xml вы можете использовать этот класс:

public class XMLParser { 

private static final String ns = null; 

public void parse(InputStream in) throws XmlPullParserException, IOException { 
    try { 
     XmlPullParser parser = Xml.newPullParser(); 
     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
     parser.setInput(in, null); 
     parser.nextTag(); 
     readPreferences(parser); 
    } finally { 
     in.close(); 
    } 
} 

private void readPreferences(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "map"); 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String node = parser.getName(); 
     if (node.equals("string")) { 
      readName(parser); 
     } else if (node.equals("int")) { 
      readValueint(parser); 
     } else if (node.equals("long")) { 
      readValuelong(parser); 
     } else { 
      skip(parser); 
     } 
    } 
} 

private void readName(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "string"); 
    String name = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "string"); 
    //Set the Preference again after it is fetched 
} 

private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
    String result = ""; 
    if (parser.next() == XmlPullParser.TEXT) { 
     result = parser.getText(); 
     parser.nextTag(); 
    } 
    return result; 
} 

private void readValueint(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "int"); 
    String ValueData = parser.getAttributeValue(null, "value"); 
    String ValueKey = parser.getAttributeValue(null, "name"); 
    //Set the Preference again after it is fetched 
} 

private void readValuelong(XmlPullParser parser) throws IOException, XmlPullParserException { 
    parser.require(XmlPullParser.START_TAG, ns, "long"); 
    String ValueData = parser.getAttributeValue(null, "value"); 
    String ValueKey = parser.getAttributeValue(null, "name"); 
    //Set the Preference again after it is fetched 
} 

private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
    if (parser.getEventType() != XmlPullParser.START_TAG) { 
     throw new IllegalStateException(); 
    } 
    int depth = 1; 
    while (depth != 0) { 
     switch (parser.next()) { 
      case XmlPullParser.END_TAG: 
       depth--; 
       break; 
      case XmlPullParser.START_TAG: 
       depth++; 
       break; 
     } 
    } 
} 

} 

И от вашего класса звоните так:

File sd = Environment.getExternalStorageDirectory(); 
     String backupDBPath1 = "your_backedUpPrefDb.xml"; 
     File backupDB1 = new File(sd, backupDBPath1); 
     InputStream is = new BufferedInputStream(new FileInputStream(backupDB1)); 
     XMLParser myXMLParser = new XMLParser(); 
     myXMLParser.parse(is); 
     is.close(); 
+1

Я могу создать резервную копию базы данных shareprefrences, и я получаю файл magicbox_database_sf.xml, но теперь я хочу ее восстановить. Как я могу восстановить? –

+0

Вы хотели, чтобы вы захотели снова создать эти настройки? – shadygoneinsane

+1

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