2017-01-24 1 views
1

Начало работы над Realm базы данных (Android), я звоню службы WCF, которая ответ является, как,Realm поле андроида дата карты с помощью createObjectFromJson()

{ 
    "ProductId": 1, 
    "ProductCategory": " CategorY_result", 
    "ProductName": "Admission", 
    "Priority": "High", 
    "EnteredBy": null, 
    "EnteredDate": "/Date(1224043200000)/", 
} 

и модель для этого, как,

public class Product extends RealmObject 
{ 
    @PrimaryKey 
    private long ProductId; 

    private String ProductCategory; 
private String ProductName; 
private String Typeofcollege; 
private String Priority; 
private Date EnteredDate; // is it mapped to Date directly ? 
} 

Я хочу Дата тип данных для поля EnteredDate, я делаю паровую синтаксический анализ с использованием createObjectFromJson метод()

realm.createObjectFromJson(Product.class,inputStream); 

, но получает значение null для EnteredDate. как можно решить эту

+0

Что вы используете для получения данных из Интернета. Любая библиотека или простой HttpClient? –

+0

HttpUrlConnection – Onkar

+0

Ручное сопоставление - ваш друг, таким образом вы можете выбросить это название названия поля «NotCamelCase» – EpicPandaForce

ответ

1

поставок WCF услуги Даты над JSON в странном формате, вы должны отформатировать его, написав свой собственный сериализации и deserialisations код (т.е. «/ Date (12345678989 + 0000) /»)

Ниже в фрагменте кода я определил, как записать объект в Realm Db, используя Gson Lib для анализа вашего Формат даты WCF в формате даты java.

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.text.TextUtils; 
import android.util.Log; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.TypeAdapter; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter; 

import java.io.IOException; 
import java.util.Date; 

import io.realm.Realm; 
import io.realm.RealmResults; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Initialize Realm 
     Realm.init(this); 

     // Get a Realm instance for this thread 
     Realm realm = Realm.getDefaultInstance(); 

     //Gson instance for date matching 
     Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new NetDateTimeAdapter()).create(); 

     //example of json you want to match 
     String stringObj = "{\n" + 
       "  \"ProductId\": 1,\n" + 
       "  \"ProductCategory\": \" CategorY_result\",\n" + 
       "  \"ProductName\": \"Admission\",\n" + 
       "  \"Priority\": \"High\",\n" + 
       "  \"EnteredBy\": null,\n" + 
       "  \"EnteredDate\": \"/Date(1224043200000)/\"\n" + 
       "  }"; 

     //Using gson lib parsing json into gson into WcfObject 
     Product object = gson.fromJson(stringObj, Product.class); 


     //write the object into realm 
     realm.beginTransaction(); 
     realm.insertOrUpdate(object); 
     realm.commitTransaction(); 

     RealmResults<Product> result = realm.where(Product.class).findAll(); 

     for (Product obj : result) { 
      //printing it to see weather it is working or not 
      Log.e("value", obj.toString()); 
     } 

    } 


    private static class NetDateTimeAdapter extends TypeAdapter<Date> { 
     @Override 
     public Date read(JsonReader reader) throws IOException { 
      if (reader.peek() == JsonToken.NULL) { 
       reader.nextNull(); 
       return null; 
      } 
      Date result = null; 
      String str = reader.nextString(); 
      str = str.replaceAll("[^0-9]", ""); 
      if (!TextUtils.isEmpty(str)) { 
       try { 
        result = new Date(Long.parseLong(str)); 
       } catch (NumberFormatException e) { 
       } 
      } 
      return result; 
     } 

     @Override 
     public void write(JsonWriter writer, Date value) throws IOException { 
      // Nah.. 
     } 
    } 
} 

Код класса продукта

import java.util.Date; 

import io.realm.RealmObject; 
import io.realm.annotations.PrimaryKey; 

public class Product extends RealmObject { 
     @PrimaryKey 
     private int ProductId; 
     private String ProductCategory; 
     private String ProductName; 
     private String EnteredBy; 
     private Date EnteredDate; 

     @Override 
     public String toString() { 
       return "WcfObject{" + 
         "ProductId=" + ProductId + 
         ", ProductCategory='" + ProductCategory + '\'' + 
         ", ProductName='" + ProductName + '\'' + 
         ", EnteredBy='" + EnteredBy + '\'' + 
         ", EnteredDate=" + EnteredDate.toString() + 
         '}'; 
     } 
} 

Все выше данный код описывается с комментарием. Дайте мне знать, если требуется какое-либо разъяснение.

+0

спасибо за ответ, я пытаюсь вставить InputStream непосредственно в базу данных (RealmObject), используя метод realm.createObjectFromJson. Я не знаю, что случилось, но после очистки и создания проекта теперь работает. – Onkar

+0

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