如何通过改造获取数据并保存到数据库
How to get data with retrofit and save to database
我有一个 android 应用程序,我需要在其中从 Web api 获取数据并将其保存到数据库中。
我正在使用改造来连接到网络 api 并且我正在使用活动 android。
这就是我到目前为止创建的内容:
我的 table 模型 "Partners",我从网络 api 检索并保存到此 table 合作伙伴中的数据。
@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");}
}
我已经创建了 ApiService
public interface APIService {
@GET("Partners")
Call<Partners> getPartners();
}
我有 api 个帮手
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;
}
}
这是我尝试调用方法从 Web api 获取数据的片段。
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) {
}
};
}
问题:如果有人能告诉我我在这里做错了什么并指导我走向正确的方向,我将不胜感激?
编辑:
你的 Call 变量需要一个 Partners
对象,但是 Callback 看到一个 List<Partners>
(这是错误的,除非你真的期望一个 JSON 列表),同时你有implements Callback<Partners>
...所以类型不匹配。
提示:为避免混淆,请将您的 class 重命名为 Partner
,因为它是 one Partner
的单个实例
我认为你有三个问题:
- 回调和调用变量不对应
- 如果您查看 retrofit2 的文档,您会看到基础 url 与
GET
注释的值连接在一起,所以我认为您 url 是 https://here-is-part-of-link/partners.json/Partners
当你打电话给 ApiService
- 当改装得到答案时,如果它是好的,它将使用
GSONConverter
(在你的助手中使用),这将需要 setter 来初始化你的对象。因此,尝试将 getter 和 setter 添加到您的 Parteners
对象
您必须在清单中添加 Internet 权限
<uses-permission android:name="android.permission.INTERNET"/>
我有一个 android 应用程序,我需要在其中从 Web api 获取数据并将其保存到数据库中。
我正在使用改造来连接到网络 api 并且我正在使用活动 android。
这就是我到目前为止创建的内容:
我的 table 模型 "Partners",我从网络 api 检索并保存到此 table 合作伙伴中的数据。
@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");}
}
我已经创建了 ApiService
public interface APIService {
@GET("Partners")
Call<Partners> getPartners();
}
我有 api 个帮手
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;
}
}
这是我尝试调用方法从 Web api 获取数据的片段。
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) {
}
};
}
问题:如果有人能告诉我我在这里做错了什么并指导我走向正确的方向,我将不胜感激?
编辑:
你的 Call 变量需要一个 Partners
对象,但是 Callback 看到一个 List<Partners>
(这是错误的,除非你真的期望一个 JSON 列表),同时你有implements Callback<Partners>
...所以类型不匹配。
提示:为避免混淆,请将您的 class 重命名为 Partner
,因为它是 one Partner
我认为你有三个问题:
- 回调和调用变量不对应
- 如果您查看 retrofit2 的文档,您会看到基础 url 与
GET
注释的值连接在一起,所以我认为您 url 是https://here-is-part-of-link/partners.json/Partners
当你打电话给ApiService
- 当改装得到答案时,如果它是好的,它将使用
GSONConverter
(在你的助手中使用),这将需要 setter 来初始化你的对象。因此,尝试将 getter 和 setter 添加到您的Parteners
对象
您必须在清单中添加 Internet 权限
<uses-permission android:name="android.permission.INTERNET"/>