簡體   English   中英

無法將數據從會議室數據庫獲取到Spinner

[英]Cannot fetch data from room database to Spinner

這個應用程式是要從api.github.com/users擷取資料,並反映在Spinner上

我在日志中獲得的數據Splash.java但不能反映數據Home.java

MyAppDatabase.java

@Database(entities = {Users.class}, version = 1, exportSchema = false)
public abstract class MyAppDatabase extends RoomDatabase {
        public abstract MyDao myDao();
    }

MyDao.java

@Dao
    public interface MyDao {

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        void addUsers(Users users);

        @Query("SELECT * FROM Users")
        List<Users> getUsers();

        @Query("SELECT node_id FROM Users")
        List<String> getNodeId();

    }

Splash.java上的getData()

   public class Splash extends AppCompatActivity {

    MyAppDatabase myAppDatabase;


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

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class, "MyDao").allowMainThreadQueries().build();


                //get data from webservice and store locally

                getData();
            }
        }, 500);
    }

    private void getData() {
        //Creating a string request
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                Log.e("response", response.toString());
                response.length();
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        Users users = new Users();

                        //Set fields in Users object.

                        users.setLogin(jsonObject.getString(Config.TAG_Login));
                        users.setId(jsonObject.getString(Config.TAG_Id));
                        users.setNode_id(jsonObject.getString(Config.TAG_Node));
                        users.setAvatar_url(jsonObject.getString(Config.TAG_Avatar));
                        users.setGravatar_id(jsonObject.getString(Config.TAG_Gravatar_id));
                        users.setUrl(jsonObject.getString(Config.TAG_url));
                        users.setHtml_url(jsonObject.getString(Config.TAG_htmi_url));
                        users.setFollowers_url(jsonObject.getString(Config.TAG_Followers_url));
                        users.setFollowing_url(jsonObject.getString(Config.TAG_Following_url));
                        users.setGists_url(jsonObject.getString(Config.TAG_Gists_url));
                        users.setStarred_url(jsonObject.getString(Config.TAG_Starred_url));
                        users.setSubscriptions_url(jsonObject.getString(Config.TAG_Subscriptions_url));
                        users.setOrganizations_url(jsonObject.getString(Config.TAG_Organizations_url));
                        users.setRepos_url(jsonObject.getString(Config.TAG_Repos_url));
                        users.setReceived_events_url(jsonObject.getString(Config.TAG_Received_events_url));
                        users.setType(jsonObject.getString(Config.TAG_Type));
                        users.setSite_admin(jsonObject.getString(Config.TAG_Site_admin));
                        users.setEvents_url(jsonObject.getString(Config.TAG_events_url));

                        myAppDatabase.myDao().addUsers(users);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                Intent intent = new Intent(Splash.this, Home.class);
                // intent.putExtra("remember", "true");
                startActivity(intent);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(
                10000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(jsonArrayRequest);
    }
}

putData()上的Home.java putData()

  public class Home extends AppCompatActivity {

    MyAppDatabase myAppDatabase;

    //To add into spinner
    private ArrayList<String> userType;

    //List of users from Db
    List<Users> users;

    private  Spinner spinner;


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

        userType = new ArrayList<>();

        spinner = findViewById(R.id.sp_user_type);

        myAppDatabase = Room.databaseBuilder(getApplicationContext(), MyAppDatabase.class,"UsersDb").allowMainThreadQueries().build();
        //get data from Db and put into arrayList for spinner

        putData();
    }

    private void putData() {

        users =myAppDatabase.myDao().getUsers();
        userType.add("Select UserType"); //Dummy addition

        for(int i = 0; i < users.size(); i++){
            userType.add(users.get(i).getType());
            Log.e("DistNames",users.get(i).getType());
        }

        users.size();
        spinner.setAdapter(new ArrayAdapter<>(Home.this, android.R.layout.simple_spinner_dropdown_item, userType));
    }
}

因為您是在循環本身中開始活動,所以實際上應該在循環之外。

實際上,您所犯的錯誤是它將在第一次迭代中啟動Home活動,因此您不會從API響應中獲取所有數據。 為了解決這個問題,讓循環遍歷每個條目並添加到數據庫中,並在完成時啟動活動,如此循環之外。

錯誤:

JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                Log.e("response", response.toString());
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        Users users = new Users();

                        //Set fields in Users object.

                        users.setLogin(jsonObject.getString(Config.TAG_Login));
                        users.setId(jsonObject.getString(Config.TAG_Id));
                        users.setNode_id(jsonObject.getString(Config.TAG_Node));
                        users.setAvatar_url(jsonObject.getString(Config.TAG_Avatar));
                        users.setGravatar_id(jsonObject.getString(Config.TAG_Gravatar_id));
                        users.setUrl(jsonObject.getString(Config.TAG_url));
                        users.setHtml_url(jsonObject.getString(Config.TAG_htmi_url));
                        users.setFollowers_url(jsonObject.getString(Config.TAG_Followers_url));
                        users.setFollowing_url(jsonObject.getString(Config.TAG_Following_url));
                        users.setGists_url(jsonObject.getString(Config.TAG_Gists_url));
                        users.setStarred_url(jsonObject.getString(Config.TAG_Starred_url));
                        users.setSubscriptions_url(jsonObject.getString(Config.TAG_Subscriptions_url));
                        users.setOrganizations_url(jsonObject.getString(Config.TAG_Organizations_url));
                        users.setRepos_url(jsonObject.getString(Config.TAG_Repos_url));
                        users.setReceived_events_url(jsonObject.getString(Config.TAG_Received_events_url));
                        users.setType(jsonObject.getString(Config.TAG_Type));
                        users.setSite_admin(jsonObject.getString(Config.TAG_Site_admin));
                        users.setEvents_url(jsonObject.getString(Config.TAG_events_url));

                        myAppDatabase.myDao().addUsers(users);

                      Intent intent = new Intent(Splash.this, Home.class);
//                        intent.putExtra("remember", "true");
                        startActivity(intent);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
            }
        });

正確:

JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                Log.e("response", response.toString());
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        Users users = new Users();

                        //Set fields in Users object.

                        users.setLogin(jsonObject.getString(Config.TAG_Login));
                        users.setId(jsonObject.getString(Config.TAG_Id));
                        users.setNode_id(jsonObject.getString(Config.TAG_Node));
                        users.setAvatar_url(jsonObject.getString(Config.TAG_Avatar));
                        users.setGravatar_id(jsonObject.getString(Config.TAG_Gravatar_id));
                        users.setUrl(jsonObject.getString(Config.TAG_url));
                        users.setHtml_url(jsonObject.getString(Config.TAG_htmi_url));
                        users.setFollowers_url(jsonObject.getString(Config.TAG_Followers_url));
                        users.setFollowing_url(jsonObject.getString(Config.TAG_Following_url));
                        users.setGists_url(jsonObject.getString(Config.TAG_Gists_url));
                        users.setStarred_url(jsonObject.getString(Config.TAG_Starred_url));
                        users.setSubscriptions_url(jsonObject.getString(Config.TAG_Subscriptions_url));
                        users.setOrganizations_url(jsonObject.getString(Config.TAG_Organizations_url));
                        users.setRepos_url(jsonObject.getString(Config.TAG_Repos_url));
                        users.setReceived_events_url(jsonObject.getString(Config.TAG_Received_events_url));
                        users.setType(jsonObject.getString(Config.TAG_Type));
                        users.setSite_admin(jsonObject.getString(Config.TAG_Site_admin));
                        users.setEvents_url(jsonObject.getString(Config.TAG_events_url));

                        myAppDatabase.myDao().addUsers(users);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                Intent intent = new Intent(Splash.this, Home.class);
                // intent.putExtra("remember", "true");
                startActivity(intent);

            }               
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM