2012-10-11 66 views
3

我有一些麻煩弄清楚我應該如何讓我的數據庫查詢讓光標選擇正確的信息。疑難解答sqlite安卓查詢

我的數據庫的結構是這樣的:http://i.stack.imgur.com/vPaoD.png(不能嵌入圖像,因爲缺乏代表的)

飼料得到了與用戶許多一對多的關係,一個項目得到了與一個一對多的關係用戶。

我想創建一個方法,該方法使用名爲getUsers(Feed feed)的方法返回特定提要中的所有用戶或項目。

我的數據庫的代碼是: 公共類DatabaseHelper擴展SQLiteOpenHelper {

// Database static variables 
private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "feedlrDatabase"; 

// Declaring feed table 
private static final String TABLE_FEED = "feed"; 
private static final String FEED_COLUMN_ID = "_id"; 
private static final String FEED_COLUMN_NAME = "name"; 

// Declaring feed-user bridge table 
private static final String TABLE_FEEDUSER = "feeduser"; 
private static final String FEEDUSER_COLUMN_FEED_ID = "feed_ID"; 
private static final String FEEDUSER_COLUMN_USER_ID = "user_ID"; 

// Declaring user table 
private static final String TABLE_USER = "user"; 
private static final String USER_COLUMN_ID = "_id"; 
public static final String USER_COLUMN_USERNAME = "username"; 
private static final String USER_COLUMN_USERID = "userid"; 
private static final String USER_COLUMN_IMGURL = "ProfileImageURL"; 
private static final String USER_COLUMN_SOURCE = "source"; 

// Declaring item table 
private static final String TABLE_ITEM = "item"; 
public static final String ITEM_COLUMN_ID = "_id"; 
public static final String ITEM_COLUMN_TEXT = "text"; 
private static final String ITEM_COLUMN_TIMESTAMP = "timestamp"; 
private static final String ITEM_COLUMN_TYPE = "type"; 
private static final String ITEM_COLUMN_URL = "URL"; 
private static final String ITEM_COLUMN_IMGURL = "imgURL"; 
private static final String ITEM_COLUMN_USER_ID = "user_ID"; 

private SQLiteDatabase db = this.getWritableDatabase(); 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

public void onCreate(SQLiteDatabase database) { 
    // @formatter:off 
    // Creating feed table 
    database.execSQL("CREATE TABLE " + TABLE_FEED + "(" + FEED_COLUMN_ID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT," + FEED_COLUMN_NAME 
      + " TEXT UNIQUE" + ")"); 

    // Creating feed-user bridge table 
    database.execSQL("CREATE TABLE " + TABLE_FEEDUSER + "(" 
      + FEEDUSER_COLUMN_FEED_ID + " INT NOT NULL," 
      + FEEDUSER_COLUMN_USER_ID + " INT NOT NULL" + ")"); 

    // Creating user table 
    // TODO Should username be the unique idenifier of a user?! 
    database.execSQL("CREATE TABLE " + TABLE_USER + "(" + USER_COLUMN_ID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT," + USER_COLUMN_USERNAME 
      + " TEXT NOT NULL," + USER_COLUMN_USERID + " TEXT UNIQUE," 
      + USER_COLUMN_IMGURL + " TEXT," + USER_COLUMN_SOURCE 
      + " TEXT NOT NULL" + ")"); 

    // Creating item table 
    database.execSQL("CREATE TABLE " + TABLE_ITEM + "(" + ITEM_COLUMN_ID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT," + ITEM_COLUMN_TEXT 
      + " TEXT," + ITEM_COLUMN_TIMESTAMP + " TEXT," 
      + ITEM_COLUMN_TYPE + " TEXT," + ITEM_COLUMN_URL + " TEXT," 
      + ITEM_COLUMN_IMGURL + " TEXT," + ITEM_COLUMN_USER_ID 
      + " INT NOT NULL" + ")"); 
    // @formatter:on 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Temporarily drops all tables 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_FEED); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_FEEDUSER); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEM); 
    onCreate(db); 
} 

public void addFeed(Feed feed) { 

    ContentValues temp = new ContentValues(); 

    temp.put(FEED_COLUMN_NAME, feed.getTitle()); 
    try { 
     db.insertOrThrow(TABLE_FEED, null, temp); 
    } catch (SQLiteConstraintException e) { 
     Log.d("ERROR", "Inserted feed is not UNIQUE!"); 
     // TODO Apply listener to notify the user that the feed name already 
     // exists! 
    } 

    // db.close(); 
} 

public void removeFeed(Feed feed) { 
    String title = feed.getTitle(); 
    long id = getFeedID(feed); 

    removeFeedBridge(id); 

    db.delete(TABLE_FEED, FEED_COLUMN_NAME + "=?", new String[] { title }); 
} 

public ArrayList<String> listFeeds() { 
    final ArrayList<String> feeds = new ArrayList<String>(); 

    Cursor c = db.rawQuery("SELECT * FROM " + TABLE_FEED, null); 
    while (c.moveToNext()) { 
     String s = c.getString(1); 
     feeds.add(s); 
    } 
    c.close(); 
    return feeds; 
} 

public long getFeedID(Feed feed) { 
    String feedTitle = feed.getTitle(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.query(TABLE_FEED, new String[] { FEED_COLUMN_ID }, 
      FEED_COLUMN_NAME + "=?", new String[] { feedTitle }, null, 
      null, null); 
    c.moveToNext(); 
    Long id = Long.parseLong(c.getString(0)); 
    c.close(); 
    return id; 
} 

public long getUserID(User user) { 
    long id = user.getId(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.query(TABLE_USER, new String[] { USER_COLUMN_ID }, 
      USER_COLUMN_ID + "=?", new String[] { id + "" }, null, null, 
      null); 
    c.moveToNext(); 
    Long id1 = Long.parseLong(c.getString(0)); 
    c.close(); 
    return id1; 
} 

public ArrayList<String> listUsers() { 
    final ArrayList<String> users = new ArrayList<String>(); 

    Cursor c = db.rawQuery("SELECT * FROM " + TABLE_USER, null); 

    while (c.moveToNext()) { 
     String s = c.getString(1); 
     users.add(s); 
    } 
    return users; 
} 

public void addUserToFeed(User user, Feed feed) { 
    long FeedID = getFeedID(feed); 
    long UserID = addUser(user); 

    // Add bridge connection 
    if (UserID != -1) { 
     addFeedUserBridge(FeedID, UserID); 
    } 
} 

public long addUser(User user) { 
    // TODO Check if the user already exists!! 

    ContentValues temp = new ContentValues(); 

    temp.put(USER_COLUMN_USERNAME, user.getUserName()); 
    temp.put(USER_COLUMN_USERID, user.getId()); 
    temp.put(USER_COLUMN_IMGURL, user.getProfileImageURL()); 
    // TODO implement source on user? 

    long userID = db.insert(TABLE_USER, null, temp); 
    return userID; 
} 

public void addFeedUserBridge(long feedID, long userID) { 

    ContentValues temp = new ContentValues(); 

    temp.put(FEEDUSER_COLUMN_FEED_ID, feedID); 
    temp.put(FEEDUSER_COLUMN_USER_ID, userID); 

    db.insert(TABLE_FEEDUSER, null, temp); 
} 

public void removeUserFromFeed(Feed feed, User user) { 
    long feedID = getFeedID(feed); 
    long userID = getUserID(user); 

    removeFeedUserBridge(feedID, userID); 
} 

private void removeUser(User user) { 

    long id = user.getId(); 
    db.delete(TABLE_USER, USER_COLUMN_ID + "=?", new String[] { id + "" }); 
} 

private void removeFeedUserBridge(long feedID, long userID) { 

    db.delete(TABLE_FEEDUSER, FEEDUSER_COLUMN_FEED_ID + "=?" + " and " 
      + FEEDUSER_COLUMN_USER_ID + "=?", new String[] { feedID + "", 
      userID + "" }); 
} 

public ArrayList<String> listFeedUser() { 
    final ArrayList<String> feeduser = new ArrayList<String>(); 

    Cursor c = db.rawQuery("SELECT * FROM " + TABLE_FEEDUSER, null); 
    while (c.moveToNext()) { 
     feeduser.add(c.getString(0) + " " + c.getString(1)); 
    } 
    c.close(); 
    return feeduser; 
} 

private void removeFeedBridge(Long id) { 

    db.delete(TABLE_FEEDUSER, FEEDUSER_COLUMN_FEED_ID + "=?", 
      new String[] { id + "" }); 
} 

public void updateUser(long userID) { 
    // TODO implement this method 
} 

public void addListOfItems(List<? extends Item> itemList) { 

    db.beginTransaction(); 
    for (Item i : itemList) { 

     ContentValues temp = new ContentValues(); 
     temp.put(ITEM_COLUMN_TEXT, i.getText()); 
     temp.put(ITEM_COLUMN_TIMESTAMP, i.getTimestamp()); 
     temp.put(ITEM_COLUMN_TYPE, i.getText()); 
     temp.put(ITEM_COLUMN_URL, i.getURL()); 
     temp.put(ITEM_COLUMN_IMGURL, i.getIMGURL()); 
     temp.put(ITEM_COLUMN_USER_ID, i.getUser().getId()); 
     db.insert(TABLE_ITEM, null, temp); 

    } 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
    // db.close(); 
} 

public Cursor getAllItems() { 

    Cursor c = db.query(TABLE_ITEM, new String[] { ITEM_COLUMN_ID, 
      ITEM_COLUMN_TEXT, ITEM_COLUMN_TIMESTAMP, ITEM_COLUMN_TYPE, 
      ITEM_COLUMN_URL, ITEM_COLUMN_IMGURL, ITEM_COLUMN_USER_ID }, 
      null, null, null, null, null); 
    // db.close(); 
    return c; 
} 

public long getItemTableSize() { 
    SQLiteDatabase database = this.getReadableDatabase(); 
    long l = DatabaseUtils.queryNumEntries(database, TABLE_ITEM); 
    // database.close(); 
    return l; 
} 

public void clearItemTable() { 
    SQLiteDatabase db = getWritableDatabase(); 
    db.delete(TABLE_ITEM, null, null); 
} 

public void addUsers(List<? extends User> users) { 

    db.beginTransaction(); 

    for (User u : users) { 
     ContentValues temp = new ContentValues(); 
     temp.put(USER_COLUMN_USERNAME, u.getUserName()); 
     db.insert(TABLE_USER, null, temp); 
    } 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 

public Cursor getAllUsers() { 

    Cursor c = db.query(TABLE_USER, new String[] { USER_COLUMN_ID, 
      USER_COLUMN_USERNAME }, null, null, null, null, null); 
    return c; 
} 

public Cursor getUsers(Feed feed) { 

    return null; 
} 

}

我試着在網上搜索有關如何「動態」查詢,但沒有帶發現了什麼。 :/

我的猜測是這樣的: Cursor c = db.rawQuery(「SELECT * FROM Item WHERE userID =(從FeedUser表中選擇所有用戶的一些參數)」);

任何人都知道如何進行此類查詢的任何有用的鏈接?

問候拉瓦

回答

2

你可以使用這樣的查詢:

SELECT * 
FROM Item 
WHERE userID IN (SELECT userID 
       FROM FeedUser 
       WHERE feedID = ?) 

但加入會更有效:

SELECT Item.field1, Item.field2, ... 
FROM Item JOIN FeedUser 
    ON Item.userID = FeedUser.userID 
+0

感謝這解決了我的問題! (: – Rawa