2013-10-08 3 views
2

У меня есть файл с именем .json wordsAndMeaning.jsonAppend JSON значение ключа пара в .json файл Titanium

{ 
    "words" : [ 
     { 
      "name" : "Apple", 
      "meaning" : "A fruit" 
     }, 
     { 
      "name" : "Truck", 
      "meaning" : "A heavy vehicle" 
     }, 
     { 
      "name" : "Zebra", 
      "meaning" : "An animal" 
     }, 
     { 
      "name" : "Rock", 
      "meaning" : "A music Genre" 
     } 
    ] 
} 

У меня есть два текстовых поля в моем окне, которое принимает имя и значение имени и отправить кнопку.

Что я хочу сделать, это заполнить текстовые поля и нажать «Отправить» (например, addEventListener), я хочу, чтобы введенные данные были добавлены в новую пару ключ-значение в вышеупомянутый файл wordsAndMeanings.json.

wordsandMeanings.json файл существует в resourceDirectory, и я использую fileSystem для его реализации.

Я новичок в концепции JSON. так что подробное объяснение с кодом будет оценено по достоинству. Я выполняю эту задачу в Titanium.

Я положу весь свой код app.js ниже

var window = Ti.UI.createWindow(); 

var view1 = Titanium.UI.createView({ 
    backgroundcolor:'21DCEE' 
}); 
var view2 = Titanium.UI.createView({}); 

var textName = Titanium.UI.createTextField({ 
    top:100, 
    left:50, 
    height:50, 
    width:150, 
    borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED, 
    hintText:'Enter the word' 
}); 

var textMeaning = Titanium.UI.createTextField({ 
    top: 200, 
    left:50, 
    width:150, 
    height:50, 
    borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED, 
    hintText:'Enter its meaning' 
}); 

var submit = Titanium.UI.createButton({ 
    top:300, 
    left:100, 
    title:'Submit' 
}); 

var tableView = Ti.UI.createTableView(); 
var tableData = []; 
var fileName = 'wordsAndMeanings.json'; 
var file = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, fileName); 
var preParseData = file.read(); 
var response = JSON.parse(preParseData); 
Ti.API.info(response.words.length); 
for(var i = 0; i < response.words.length ; i++){ 
    word = response.words[i]; 
    row = Ti.UI.createTableViewRow({ 
     height : '60dp' 
    }); 
    nameLabel = Ti.UI.createLabel({ 
     text: word.name, 
     font: { fontSize:'24dp', fontWeight:'bold'}, 
     height:'auto', 
     left:'10dp', 
     color:'#000', 
     touchEnabled : false 
    }); 
    row.add(nameLabel); 
    tableData.push(row); 
    tableView.setData(tableData); 
} 

var add = Titanium.UI.createButton({ 
    title: 'Add', 
    top: 150, 
    left: 50 
}); 

add.addEventListener('click',function(e){ 
    window2 = Titanium.UI.createWindow({ 
     backgroundColor:'8FD2ED' 
    }); 

    submit.addEventListener('click', function(e){ 
     //response.words.push({"name" : "abc", "meaning" : "alphabets"}); 
     //Ti.API.info(typeof(textName.value)); 
     //var one = JSON.parse(textName.value); 
     //Ti.API.info(one); 
     var obj = eval("(textName.value)"); 
     Ti.API.info(obj); 
     //var file2 = Titanium.FileSystem.getFile(Titanium.FileSystem.resourcesDirectory,'wordsAndMeanings.json'); 
     //file2.write() 
    }); 


    window2.open(); 
    window2.add(view2); 
    view2.add(textName); 
    view2.add(textMeaning); 
    view2.add(submit); 
}); 
window.open(); 
window.add(view1); 
view1.add(tableView); 
view1.add(add); 

ответ

1

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

Поскольку вы уже разборе данные в словаре (var response = JSON.parse(preParseData);), я бы Append ваши новые данные в точности так, как вы сделали это в представить EventListener (//response.words.push({"name" : "abc", "meaning" : "alphabets"});), и в конце концов, stringify словарь ответ, чтобы сохранить Это.

1) Таким образом, читать и синтаксического разбора JSON:

var fileName = 'wordsAndMeanings.json'; 
var file = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, fileName); 
var preParseData = file.read().text; // file.read() will return the blob. file.read().text is what you want 
var response = JSON.parse(preParseData); 

2) Получить поля данных нажмите кнопку мыши и добавить данные

submit.addEventListener(click, function(e) { 
var userTextMeaning = textMeaning.value; // Read value property of both fields 
var userTextName = textName.value; 
response.words.push({"name" : userTextName, "meaning" : userTextMeaning}); // Push the new data to response list 
} 

3) Stringify и сохранить в applicationDataDirectory

var fileName = 'wordsAndMeanings.json'; 
var file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, fileName); 
var json = JSON.stringify(response); 
file.write(json) 
+0

В соответствии с [ссылка] (https://wiki.appcelerator.org/display/guides/Filesystem+Access+and+Storage) resourcesDirectory поддерживает чтение и запись на тренажере/EMULATOR. Я работаю над симулятором, а не на самом устройстве. А также мне нужно написать ** текстовое поле ** данных (например, textName и textMeaning) в .json-файл, как я могу извлечь эти данные и записать их в файл в качестве новой пары ключ-значение? –

0

Вы можете использовать write method писать в файл Titanium. Прежде чем делать это, вы должны понимать около Titanium File System.

Также вы должны изменить заявление var obj = eval("(textName.value)"); на номер var obj = eval("(" + textName.value + ")");.

0

Использование Titanium.App.Properties() вместо файловой системы было бы намного лучше. Вы можете легко хранить и извлекать весь объект, используя:

  • Ti.App.Properties.getObject('propertyName', defaultValue); - Второй параметр возвращается, когда свойство не существует.
  • Ti.App.Properties.setObject('propertyName', value);
Смежные вопросы