多对多的关系

时间:2014-01-14 10:13:22

标签: android parse-platform

我在Parse.com上有两个课程:Image&数据。在Data类中,我正在保存3个字段Name,Mobile-number&占用。在Image类中,我正在保存图像。

我必须在这两个类之间创建关系,以便我可以使用相应的移动号码获取图像。一个手机号码可以保存很多图像和表格数据可以有很多手机号码。

无法找到如何使用特定手机号码获取图像。请通过文档获取帮助。提前致谢。这是我的代码:

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();
        } 
        }
    });       
}

在询问手机号码后,点击getImage按钮查询该手机号码的所有图片。

// 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 个答案:

答案 0 :(得分:1)

我不是Android开发人员,但我会尝试使用此版本。你有两个类,数据和图像。每个数据实例都可以与许多图像相关联。使每个数据实例唯一的信息是名为Mobile-Number的属性。

您有三种选择: 1. Parse.com数组 2. Parse.com关系 3.一个关联类(如Waquas所建议的那样)。

  1. 如果数据实例链接到少于约50张图像, Parse.com数组是一个很好的解决方案。将图像与数据关联时,请使用Parse.com“添加”方法:
  2. aData.add("images", someImageObject);
    aData.saveInBackground();
    

    可以一次关联图像列表:

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

    从parse中检索Data实例时,Image对象显示为“指针”数组。要撤回实际的Image对象,请使用“fetch”。有关如何使用fetch的示例,请查看Parse.com文档的这一部分:

      

    默认情况下,在获取对象时,相关的ParseObjects不是   牵强。这些对象的值在有之前无法检索   像这样被抓住了:

    fetchedComment.getParseObject("post")
        .fetchIfNeededInBackground(new GetCallback<ParseObject>() {
            public void done(ParseObject object, ParseException e) {
              String title = post.getString("title");
            }
        }); 
    
    1. Parse.com关系比阵列解决方案更具可扩展性。如果单个数据与数百或数千个图像相关联,则这是正确的解决方案。我已经开始在我自己的代码中将数组切换为关系。
    2.     ParseRelation relation = aData.getRelation("images");    
          relation.add(someImageObject);     
          aData.saveInBackground();
      
      1. 如果有关于数据和图像之间关系的额外信息,关联类是一个很好的解决方案 - 例如,如果用户可以将图像标记为“我的一个最爱”。要解决此问题,请在Parse.com中创建一个名为ImageAssociation的新类。该类有三个属性:

        • theDataObject(或只是Data对象的手机号码)
        • theImageObject
        • isFavorite(真或假)
      2. 我不会介绍这个解决方案的机制。在他的答案中关注Waquas的链接以获取一般信息。另请参阅有关“关系”的Parse.com文档。

答案 1 :(得分:0)

我无法准确地告诉你代码,但从数据库的角度来看,拥有多对多关系的表并不是一个好主意。为了解决许多&lt; - &gt;许多关系,你必须打破它们如下:

  

一个 - &gt;许多&lt; - 一个

有关详情,请参阅:http://qisql.com/qisql_sqlite_many2many.html