【问题标题】:Issues implementing SQLite and Cursor in an Activity在 Activity 中实现 SQLite 和 Cursor 的问题
【发布时间】:2011-09-04 16:28:51
【问题描述】:

我有一个活动,它显示了来自网络上 JSON 数据的 3 张随机图像。每个随机图像都是可点击的,并导致其详细信息活动,带有其标题、图像、描述等。显示的图像彼此不同。

我需要为该活动实现 SQLite 和 Cursor,以便在没有互联网连接时,应用程序从外部存储上的缓存中读取图像数据。我已经有了数据库、提供者和同步的类。我有一个包含以下列的 SQLite 数据库:

  • BaseColumns._ID
  • Database.Project.C_SMALLIMAGE

这里是我目前的sn-ps代码:

void doSync() {
    Intent serviceIntent = new Intent(this, LooserSync.class);
    startService(serviceIntent);
} 

此方法调用我放置 URL 的 Web 服务。这是加载的图像:

public void setViewImage(ImageView v, String value) {
    v.setTag(value);
    loader.DisplayImage(value, context, v);
}

这是我的旧功能,可以随机化图像并使其可点击:

prjcts = new ArrayList<Project>();
int max = prjcts.size();
System.out.println(max);
List<Integer> indices = new ArrayList<Integer>(max);
for(int c = 1; c < max; ++c) {
    indices.add(c);
}
Random r = new Random();
int arrIndex = r.nextInt(indices.size());
int randomIndex1 = indices.get(arrIndex);
indices.remove(arrIndex);

这是我目前的活动:

int arrIndex2 = r.nextInt(indices.size());
int randomIndex2 = indices.get(arrIndex2);
indices.remove(arrIndex2);

int arrIndex3 = r.nextInt(indices.size());
int randomIndex3 = indices.get(arrIndex3);
indices.remove(arrIndex3);

imageLazy(image1, prjcts.get(randomIndex1),Main.this);
imageLazy(image2, prjcts.get(randomIndex2),Main.this);
imageLazy(image3, prjcts.get(randomIndex3),Main.this);

image1.setOnClickListener(new RandomClickListener(randomIndex1));
image2.setOnClickListener(new RandomClickListener(randomIndex2));
image3.setOnClickListener(new RandomClickListener(randomIndex3));

public void imageLazy(final ImageView image,Project pro,Activity activity) {
     String imageurl = pro.smallImageUrl;
     image.setTag(imageurl);
     loader.DisplayImage(imageurl, activity,image);
}

public class RandomClickListener implements View.OnClickListener {
     private final int randomIndex;

     public RandomClickListener(final int randomIndex) {
           this.randomIndex = randomIndex;
     }
     @Override
     public void onClick(View v) {
          Intent top = new Intent(Main.this, DetailsActivity.class);
          top.putExtra("spendino.de.ProjectDetail.position", randomIndex);
          /*
          top.setData(Uri.withAppendedPath(Uri.withAppendedPath(
          LooserProvider.CONTENT_URI, Database.Project.NAME), Long.toString(id)));
           */
          startActivity(top);
     }
}

这是一个检索图像详细信息的函数:

Uri uri = Uri.withAppendedPath(Uri.withAppendedPath( LooserProvider.CONTENT_URI, Database.Project.NAME), Long .toString(id));

Cursor managedCursor = managedQuery( uri, new String[] { BaseColumns._ID, Database.Project.C_BIGIMAGE }, null, null, "RANDOM() LIMIT 3");

关于如何从这些 sn-ps 构建代码有什么建议吗?

【问题讨论】:

    标签: android sqlite android-sqlite


    【解决方案1】:

    为了 FSM 的缘故,使用 ListView 进行这样的查询

    Cursor managedCursor = managedQuery( //it seems like you should change your internship
                    uri, //to somthing esier than programming
                    projection,    // Which columns to return.
                    null,          // WHERE clause.
                    null,          // WHERE clause value substitution
                    "RANDOM() LIMIT 3");   
    

    通过此查询,您可以从 Project 表中以随机顺序获取前 3 行

    编辑:

    1. 使用列表视图
    2. 错误的uri ...你没有做作业(通过阅读this)。试试这个。 Uri uri = Uri.withAppendedPath( LooserProvider.CONTENT_URI, Database.Project.NAME));
    3. 关于使用游标:

      光标 c = query();

      if(c.moveToFirst()){

      do{
      
          //do something with current row like c.getString(1);
      
      }while(c.moveToNext());
      

      }

    4. 但是为什么你不使用 ListView

    编辑2: 将my sample for looser中的类似行更改为:

        listView.setAdapter(new MySimpleCursorAdapter(this, R.layout.itemrow,
                managedQuery(Uri.withAppendedPath(LooserProvider.CONTENT_URI,
                        Database.Project.NAME), new String[] { BaseColumns._ID,
                        Database.Project.C_PROJECTTITLE,
                        Database.Project.C_ORGANIZATIONTITLE,
                        Database.Project.C_SMALLIMAGE }, null, null, "RANDOM() LIMIT 3"),
                new String[] { Database.Project.C_PROJECTTITLE,
                        Database.Project.C_ORGANIZATIONTITLE,
                        Database.Project.C_SMALLIMAGE }, new int[] {
                        R.id.tName, R.id.tDescription, R.id.iItem }));
    

    你可以做 Menu->Synchronize 看看发生了什么

    从 listrow 中删除文本,你就得到了你的程序

    【讨论】:

    • 所以我尝试了一些东西,你可以查看我更新的问题..我还需要什么?
    • 谢谢,我会试试的。我不使用列表视图,因为我不需要将其显示为列表视图,我只需要显示 3 张图像并且它必须是水平的
    • 使用 EDIT2 实际上是一个聪明的主意,现在我试图弄清楚列表视图如何是水平的。最重要的是,当我单击随机列表时,它应该引导我进入它的详细信息活动,而不是基于 json 上的条目位置的详细信息
    • 1.很难构建水平 ListView ... 2.您单击图像,然后获得有关此特定操作的详细信息(这是我的示例的工作方式)或 ListActivity 的所有条目?
    • 1.我正在弄清楚 2.to 像你的例子那样去细节。但是仅通过更改适配器,它总是会转到 json 数据上第一个条目的详细信息,而不是随机显示图像的详细信息。
    【解决方案2】:

    我认为您必须提出一个相对容易回答的问题。 大多数人都不想为你编写代码。

    【讨论】:

    • 你应该把它写成评论而不是写成答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多