Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
Faustlogger
43 / 35 / 2
Регистрация: 14.09.2011
Сообщений: 158
Записей в блоге: 1
#1

Сохранение изменений в xml файл - Программирование Android

09.09.2012, 22:21. Просмотров 4341. Ответов 7
Метки нет (Все метки)

Задача. Допустим, имеется xml файл расположенный в "res\xml\shop_items.xml". С парсингом файла проблем не возникает. Изучил работу с XmlPullParser (но могу переделать все и под DOM парсер). Да, данные извлекает, все отлично. Но, встал вопрос о том, КАК ВНЕСТИ ИЗМЕНЕНИЯ В ФАЙЛ? (Капсом написал ибо уже до истерики дошел, честно ).

Я уже курил мануалы и от ibm и на stackoverflow и что-то нифига не догнал как записать изменения в файл, расположенный в папке "res\xml\shop_items.xml" приложения. Кто уже делал, напишите хотя бы самый простенький пример, а дальше я догоню.

Вот раньше все супер с xml-файлами было. В обычном проекте все суперски и записывает, и считывает. А тут пляски с бубном! ><
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.09.2012, 23:06     Сохранение изменений в xml файл #2
http://developer.android.com/intl/ru...a-storage.html
Faustlogger
43 / 35 / 2
Регистрация: 14.09.2011
Сообщений: 158
Записей в блоге: 1
09.09.2012, 23:33  [ТС]     Сохранение изменений в xml файл #3
V0v1k, попробовал, не получилось.

Вот мой код.

Файл Main.java. Выполняет обработку событий на форме. При тестировании использовал имя файла shop_items.xml и res\\xml\\shop_items.xml
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.test;
 
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
 
public class Main extends Activity {
 
    private ArrayList<Item> iList;
    private DataDocument doc;
    private String FILENAME = "res\\xml\\shop_items.xml";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);         
        
        doc = new DataDocument(getResources().getXml(R.xml.shop_items));
        
        iList = doc.getItemList();
        
        for(int i = 0; i<iList.size(); i++){
            System.out.println(iList.get(i).getName());
        }
        
        Button buyButton = (Button) findViewById(R.id.button_buy);
        
        buyButton.setOnClickListener(new OnClickListener(){
 
            public void onClick(View v) {
                iList.add(new Item("Nokia 5800","smartphone","320.00",1));
                try {
                    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
                    fos.write(doc.writeXML(iList).getBytes());
                    fos.close();
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    Log.e("FileNotFoundException", e.getMessage());
                } catch (IOException ie) {
                    Log.e("IOException", ie.getMessage());
                }
                
            }
            
        });
        
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
Класс Item(Item.java) - хранит в себе данные о товаре.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.example.test;
 
public class Item {
    private String name;
    private String type;
    private String price;
    private int sum;
    
    public Item(String name, String type, String price, int sum){
        this.setName(name);
        this.setType(type);
        this.setPrice(price);
        this.setSum(sum);
    }
    
    public String getName(){
        return this.name;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getType(){
        return this.type;
    }
    
    public void setType(String type){
        this.type = type;
    }
    
    public String getPrice(){
        return this.price;
    }
    
    public void setPrice(String price){
        this.price = price;
    }
    
    public int getSum(){
        return this.sum;
    }
    
    public void setSum(int sum){
        this.sum = sum;
    }
}
Класс DataDocument.java отвечает за обработку XML.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.example.test;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
 
import android.content.Context;
import android.util.Log;
import android.util.Xml;
 
public class DataDocument {
    private XmlPullParser parser;
    
    public DataDocument(XmlPullParser newParser){
        this.setParser(newParser);
    }
    
    public void setParser(XmlPullParser newParser){
        this.parser = newParser;
    }
    
    public ArrayList<Item> getItemList(){
        ArrayList<Item> result = new ArrayList<Item>();
        try{
            while(parser.getEventType()!=XmlPullParser.END_DOCUMENT){
                if(parser.getEventType()==XmlPullParser.START_TAG && parser.getName().equals("item")){
                    result.add(new Item(parser.getAttributeValue(0), parser.getAttributeValue(1), parser.getAttributeValue(2), Integer.parseInt(parser.getAttributeValue(3))));                 
                }  
                parser.next();
            }
        }catch(XmlPullParserException e){
            System.out.println("Error: "+e.getStackTrace());
        } catch (IOException e) {
            System.out.println("Error: Can't parse file");
        }
        return result;
    }
    
    public String writeXML(ArrayList<Item> itemList){
        
        XmlSerializer serializer = Xml.newSerializer();
        StringWriter writer = new StringWriter();
        try{
            serializer.setOutput(writer);
            serializer.startDocument(null, Boolean.valueOf(true));
            serializer.startTag(null, "items");
            
            for(int i = 0; i<itemList.size();i++){
                serializer.startTag(null, "item");
                serializer.attribute(null, "name", itemList.get(i).getName());
                serializer.attribute(null, "type", itemList.get(i).getType());
                serializer.attribute(null, "price", itemList.get(i).getPrice());
                serializer.attribute(null, "sum", String.valueOf(itemList.get(i).getSum()));
                serializer.endTag(null, null);
            }
            
            serializer.endTag(null, "items");
            serializer.endDocument();
            //serializer.flush();
        }catch(Exception e) {
            Log.e("Exception", "Exception occured in wroting");
        }
        return writer.toString();
    }
}
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.09.2012, 23:35     Сохранение изменений в xml файл #4
что пробовали?
Вы наверное меня не правильно поняли, там написано куда именно нужно писать данные.
Faustlogger
43 / 35 / 2
Регистрация: 14.09.2011
Сообщений: 158
Записей в блоге: 1
09.09.2012, 23:44  [ТС]     Сохранение изменений в xml файл #5
V0v1k, ааа. Ну это не то. Мне нужно сохранять изменения в xml файл который находится прямо в папке приложения.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.09.2012, 23:50     Сохранение изменений в xml файл #6
делайте как написано в документации.

если вы найдете хак / лазейку / недокументированный способ (нужное подчеркнуть) делать не так как следует, то:

1) нет гарантии, что это будет работать на: всех моделях девайсов, всех версиях андроида, будущих версиях девайсов, будущих версиях андроида;
2) при апдейте вашего приложения пользователь будет терять все свои изменения, так как ресурсы новой версии заменят собой ресурсы старой версии.
Faustlogger
43 / 35 / 2
Регистрация: 14.09.2011
Сообщений: 158
Записей в блоге: 1
10.09.2012, 00:08  [ТС]     Сохранение изменений в xml файл #7
V0v1k, да у меня это тестовое задание. Всегда отлично работал с xml, а как до андроида дело дошло, начались косяки. Дело в том, что по заданию, мне надо в xml хранить данные о товаре (Наименование, Цена, Количество), приложение должно считывать данные(с этим проблем нет) и записывать информацию о новом товаре или же об изменениях связанных с количеством товара.

Добавлено через 5 минут
Данные о доступных к продаже товаров необходимо запоминать, чтобы после выхода
программы они могли быть восстановлены. Здесь вы можете использовать XML, JSON или
другие (в том числе и бинарные форматы данных) для сериализации.

Добавлено через 44 секунды
И я решил сделать на базе XML
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 00:29     Сохранение изменений в xml файл
Еще ссылки по теме:
Как получить файл XML от веб-сервиса Android
Как создать файл (txt, xml) в android (Eclipse) Android
Сохранение курса валют в файл,что бы каждый раз при открытии не синхронизироваться? Android
Android Виджет перестает работать после изменений в коде
Сохранение изменений в web.xml(Tomcat) Java EE

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.09.2012, 00:29     Сохранение изменений в xml файл #8
ну так я дал ссылку где написано куда нужно эти данные пихать.

Добавлено через 15 минут
проще говоря, ресурсы предназначены только для чтения. если хотите в них держать стартовые записи, то вначале копируете их с ресурсов в Internal/External Storage, а там уже модифицируете.
Yandex
Объявления
10.09.2012, 00:29     Сохранение изменений в xml файл
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru