2016-07-22 10 views
1

Ich habe eine Android-App, in der ich Daten von Web-API abrufen und in der Datenbank speichern muss.So erhalten Sie Daten mit Retrofit und speichern in der Datenbank

Ich benutze Retrofit zum Verbinden mit Web-API und auch ich benutze aktive Android.

So ist es das, was ich bisher erstellt:

Mein Tischmodell „Partner“, die Daten, die ich von Web-api Abrufen und in diese Tabelle Partner zu speichern.

@Table(name = "Partners") 
public class Partners extends Model { 
    @Expose 
    @Column(name = "Name") 
    public String name; 
    public Partners() {} 
    public List<Partners> getPartners() { return getMany(Partners.class, "Partners");} 
} 

Ich habe ApiService erstellt

public interface APIService {  
    @GET("Partners") 
    Call<Partners> getPartners(); 
} 

Ich habe api Helfer

public class APIHelper { 

    public static APIService apiService; 

    public static APIService getApiService() { 
     if (apiService == null) { 
      Retrofit retrofit = new Retrofit.Builder().baseUrl("https://here-is-part-of-link/partners.json") 
        .addConverterFactory(GsonConverterFactory.create()).build(); 
      apiService = retrofit.create(APIService.class); 
     } 
     return apiService; 
    } 
} 

Jahr Dies ist mein Fragment, wo ich versuche Methode aufzurufen Daten aus Web-api zu bekommen.

public class MainFragment extends Fragment implements Callback<Partners> { 

    Button shippingFragment, deliveryFragment, measurementFragment, takeOversFragment; 
    private Call<Partners> call; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.main_fragment, parent, false); 
     getActivity().setTitle("Title"); 
     shippingFragment = (Button) view.findViewById(R.id.shipping); 
     deliveryFragment = (Button) view.findViewById(R.id.delivery); 
     measurementFragment = (Button) view.findViewById(R.id.measurement); 
     takeOversFragment = (Button) view.findViewById(R.id.take_overs); 
     shippingFragment.setOnClickListener(btnFragmentListener); 
     deliveryFragment.setOnClickListener(btnFragmentListener); 
     measurementFragment.setOnClickListener(btnFragmentListener); 
     takeOversFragment.setOnClickListener(btnFragmentListener); 

     call = APIHelper.getApiService().getPartners(); 
     call.enqueue(this); 

     return view; 
    } 

    Button.OnClickListener btnFragmentListener = (new Button.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment fragment = null; 
      Intent intent = null; 
      switch (v.getId()) { 
       case R.id.shipping: 
        fragment = new ShippingFragment(); 
        replaceFragment(fragment); 
        break; 
       case R.id.delivery: 
        fragment = new DeliveryMain(); 
        replaceFragment(fragment); 
        break; 
       case R.id.measurement: 
        intent = new Intent(getActivity(), MeasurementMain.class); 
        startActivity(intent); 
        break; 
       case R.id.take_overs: 
        intent = new Intent(getActivity(), AllLogs.class); 
        startActivity(intent); 
        break; 
      } 
     } 
    }); 

    public void replaceFragment(android.support.v4.app.Fragment rFragment) { 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
     transaction.replace(R.id.fragment_holder, rFragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 


    final Callback<List<Partners>> partnersCallback = new Callback<List<Partners>>() { 
     @Override 
     public void onResponse(Call<List<Partners>> call, Response<List<Partners>> response) { 
      for(Partners partners) { 
       partners.save(); 
      } 
     } 

     @Override 
     public void onFailure(Call<List<Partners>> call, Throwable t) { 

     } 
    }; 
} 

FRAGE: Ich wäre dankbar, wenn mir jemand sagen könnte, was ich hier falsch gemacht und führe mich in die rechte Richtung ??

EDIT:

enter image description here

+0

Sie haben nicht gesagt, was mit diesem Code –

+0

@ cricket_007 falsch ist das, was falsch ist ist, dass dieser Teil des Codes bricht und nicht in Tabellenpartner speichert. – RubyDigger19

+0

Bitte fügen Sie das Logcat oder die Kompilierung Fehlermeldung –

Antwort

1

Ihre Anrufvariable erwartet ein Partners Objekt, aber der Rückruf sieht ein List<Partners> (das ist, was falsch ist, wenn Sie tatsächlich eine JSON-Liste tun erwarten), mittlerweile haben Sie implements Callback<Partners> ... Also stimmen die Typen nicht überein.

Tipp: Um Verwirrung zu vermeiden, Ihre Klasse zu Partner umbenennen, da es

0

Ich denke, eine einzelne Instanz ein Partner ist haben Sie drei Probleme:

  1. Der Rückruf und Variable rufen nicht entsprechen Wenn Sie die Dokumentation von Retrofit2 sehen, können Sie sehen, dass die Basis-URL mit dem Wert GET Annotation verkettet ist
  2. Wenn Retrofit die Antwort bekommt, wenn es gut ist, wird es GSONConverter (in Ihrem Helfer verwenden) verwenden, der Setter benötigt, um Ihr Objekt zu initialisieren. So versuchen Getter und Setter zu Ihrem Parteners Objekt hinzufügen
+0

Ich machte Callback und Call-Variablen entsprach. Auch geänderter Link, wenn ich ApiService anrufe. Und immer noch nicht funktioniert. Trotzdem werden nicht alle Partner aus dem Web und auch nicht in DB gespeichert (dieser Teil ist mir auch unklar). Ich werde Fehlerprotokoll in Frage stellen. – RubyDigger19

1

Sie müssen Internet Erlaubnis auf Ihrem hinzufügen manifest

<uses-permission android:name="android.permission.INTERNET"/>