Many to many relation

2019-02-15 19:54发布

I have two classes on Parse.com : Image & Data. In Data class, I am saving 3 fields Name,Mobile-number & Occupation. In Image class I'm saving images.

I have to create relation between these two classes so that I can fetch images with the corresponding mobile-number. one mobile number can save many images and the table Data can have many mobile numbers.

Not able to find how can I fetch the images with a particular mobile number. Please help as I have gone thru the documentation. Thanks in advance. Here is my code:

public class GetImage extends Activity {
// Declare Variables
GridView gridview;
List<ParseObject> ob;
ProgressDialog mProgressDialog;
GridViewAdapter adapter;
Button imgbtn;
EditText mbltxt;
String mobileNumber;
private List<PhoneList> phonearraylist = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the view from gridview_main.xml
    setContentView(R.layout.listview_main);
    // Execute RemoteDataTask AsyncTask
    imgbtn=(Button) findViewById(R.id.imgbtn);
    mbltxt = (EditText) findViewById(R.id.mbltxt);

    imgbtn.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

                if (mbltxt.getText().toString().equals("")) {
                    Toast.makeText(getBaseContext(), "Please enter a valid mobilenumber", Toast.LENGTH_LONG).show();    
                }else {
             new RemoteDataTask().execute();
        } 
        }
    });       
}

After asking for mobile number, click on getImage button to query all the images for that mobile number.

// RemoteDataTask AsyncTask
private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create a progressdialog
        mProgressDialog = new ProgressDialog(GetImage.this);
        // Set progressdialog title
        mProgressDialog.setTitle("Images");
        // Set progressdialog message
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(false);
        // Show progressdialog
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Create the array
        phonearraylist = new ArrayList<PhoneList>();
        try {
            // Locate the class table named "Image" in Parse.com
            ParseRelation<ParseObject> relation = currentUser.getRelation("img");
            ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Image");

            ob = query.find();
            for (ParseObject imgob : ob) {
                ParseFile image = (ParseFile) imgob.get("ImageFile");
                PhoneList map = new PhoneList();
                map.setPhone(image.getUrl());
                phonearraylist.add(map);
            }
         }catch (ParseException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // Locate the gridview in gridview_main.xml
        gridview = (GridView) findViewById(R.id.gridview);
        // Pass the results into ListViewAdapter.java
        adapter = new GridViewAdapter(GetImage.this,
                phonearraylist);
        // Binds the Adapter to the ListView
        gridview.setAdapter(adapter);
        // Close the progressdialog
        mProgressDialog.dismiss();
    }
}}

2条回答
乱世女痞
2楼-- · 2019-02-15 20:34

I can't exactly tell you the code, but from database perspective, its not a good idea to have tables with many to many relationship. In order to resolve many <-> many relationships, you must break them as below:

one -> many <- one

For more info, read this: http://qisql.com/qisql_sqlite_many2many.html

查看更多
▲ chillily
3楼-- · 2019-02-15 20:44

I'm not an Android developer, but I'll try to field this one. You have two classes, Data and Image. Each instance of Data can be associated to many Images. The piece of information that makes each instance of Data unique is the attribute named Mobile-Number.

You have three options: 1. Parse.com Array 2. Parse.com Relation 3. An association class (as Waquas suggests).

  1. A Parse.com array is a good solution if an instance of Data is linked to fewer than about 50 images. When you associate an Image to a Data, use the Parse.com "add" method:
aData.add("images", someImageObject);
aData.saveInBackground();

It is possible to associate a list of Images in one go:

aData.addAll("images", Arrays.asList(image1, image2, image3));

When you retrieve a Data instance from parse, the Image objects show up as an array of "pointers". To pull back the actual Image objects, use "fetch". For example of how to use fetch, look for this section of the Parse.com documentation:

By default, when fetching an object, related ParseObjects are not fetched. These objects' values cannot be retrieved until they have been fetched like so:

fetchedComment.getParseObject("post")
    .fetchIfNeededInBackground(new GetCallback<ParseObject>() {
        public void done(ParseObject object, ParseException e) {
          String title = post.getString("title");
        }
    }); 
  1. A Parse.com relation is more scalable than the array solution. If a single Data is associated with hundreds or thousands of images, this is the correct solution. I have started switching my arrays to relations in my own code.
    ParseRelation relation = aData.getRelation("images");    
    relation.add(someImageObject);     
    aData.saveInBackground();
  1. An association class is a good solution if there is extra information about about the relationship between Data and Image-- for example, if a user can mark an image as "one of my favorites". To solve this problem, create a new class in Parse.com called ImageAssociation. The class has three attributes:

    • theDataObject (or just the Data object's Mobile Number)
    • theImageObject
    • isFavorite (true or false)

I won't go into the mechanics of this solution. Follow Waquas' link in his answer for general information. See also the Parse.com documentation about "relations".

查看更多
登录 后发表回答