获取具有数据库生成ID的项的ID

时间:2016-11-01 15:37:06

标签: android database sqlite

所以,我对如何使用数据库生成的ID搜索数据库感到困惑。

假设我将100个项目添加到我的数据库并使用INTEGER AUTOINCREMENT PRIMARY KEY。当我使用insert添加一行时,我将获得返回给我的该行的ID,但是如何使用它返回给我的ID搜索该数据库?我是否必须保留一个不同的表格,其中包含所有链接到的ID和值,因为这似乎使我的数据库无用。

我对数据库没有太多经验,也找不到任何相关信息,但我认为它与索引有关?

修改

这是我的datatbase助手类,InventoryDBHelper:

public class InventoryDbHelper extends SQLiteOpenHelper{


private final static String TAG = "InventoryDBHelper";

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Inventory.db";

private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE " + InventoryContract.Inventory.TABLE_NAME + " (" +
                InventoryContract.Inventory._ID + " INTEGER PRIMARY KEY," +
                InventoryContract.Inventory.COLUMN_NAME_NAME + " TEXT," +
                InventoryContract.Inventory.COLUMN_NAME_PRICE + " INT" + " );";

private static final String SQL_DELETE_ENTRIES =
        "DROP TABLE IF EXISTS " + InventoryContract.Inventory.TABLE_NAME;

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

@Override
public void onCreate(SQLiteDatabase db){
    db.execSQL(SQL_CREATE_ENTRIES);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    db.execSQL(SQL_DELETE_ENTRIES);
    onCreate(db);
}

public boolean insertItem(String name, int price){
    SQLiteDatabase write_db =  getWritableDatabase();
    ContentValues write_values = new ContentValues();

    write_values.put(InventoryContract.Inventory.COLUMN_NAME_NAME, name);
    write_values.put(InventoryContract.Inventory.COLUMN_NAME_PRICE, price);

    write_db.insert(InventoryContract.Inventory.TABLE_NAME, null, write_values);

    return true;
}

public boolean updateItem(Integer id, String name, int price){
    SQLiteDatabase write_db = getWritableDatabase();
    ContentValues write_values = new ContentValues();

    write_values.put(InventoryContract.Inventory.COLUMN_NAME_NAME, name);
    write_values.put(InventoryContract.Inventory.COLUMN_NAME_PRICE, price);

    write_db.update(InventoryContract.Inventory.TABLE_NAME, write_values, InventoryContract.Inventory._ID + " = ? ", new String[]{ Integer.toString(id)});

    return true;
}

public Cursor getItem(int id){
    SQLiteDatabase read_db = getReadableDatabase();

    return read_db.rawQuery("SELECT * FROM " + InventoryContract.Inventory.TABLE_NAME + " WHERE" + InventoryContract.Inventory._ID + "=?",
            new String[] {Integer.toString(id)});
}

public Cursor getAllItems(){
    SQLiteDatabase read_db = getReadableDatabase();

    return read_db.rawQuery("SELECT * FROM " + InventoryContract.Inventory.TABLE_NAME, null);
}

public Integer deleteItem(Integer id){
    SQLiteDatabase write_db = getWritableDatabase();

    return write_db.delete(InventoryContract.Inventory.TABLE_NAME,
            InventoryContract.Inventory._ID + " = ? ",
            new String[] {Integer.toString(id)});
}

}

1 个答案:

答案 0 :(得分:0)

如果您的数据库只有一个表,那么唯一ID似乎对您没什么帮助。使用CursorAdapter来支持ListView中的SQL数据时,它们是必需的,因此您肯定希望它们在您的表中。

一旦获得多个表,从另一个表中的记录引用一个表中的记录的能力对于创建有用的查询至关重要。使用唯一ID,您可以支持多对多关系。让我们看一个简单的例子。

您正在开发一款应用来管理汽车租赁业务。你明白你需要一张汽车用的桌子。租来的每辆车都有自己的记录,因此有一个唯一的ID。

您希望存储有关客户的数据,因此您将拥有一个客户表。每个客户也将拥有自己的记录和唯一ID。

您可能有第三张租赁表。您想要跟踪客户何时租用汽车以及许多其他信息,如价格,保险等等。

因此,如果您已经拥有汽车表和客户表,那么复制所有数据是没有意义的,因此在租赁表中您只需存储汽车记录的ID和客户的ID记录,以及其他信息。

所以说你插入新的客户数据并获得唯一的ID。您可以将该ID放入新的租赁记录中,以将租金与该客户相关联。

在关系数据库中,查询可以连接表中的数据以创建数据集。通过这种方式,您可以提出以下问题:

  • 以前哪些客户使用此VIN租车?

    SELECT customer.name FROM customer, rental, car WHERE customer.id = rental.customer AND rental.car = car.id AND car.vin = 'VIN'

  • 以前租过这个姓氏的客户有哪些车?

    SELECT car.vin FROM car, rental, customer WHERE car.id = rental.car AND rental.customer = customer.id AND customer.last_name = 'LASTNAME'

因此,当记录ID放在其他表的记录中时,它们允许您向数据库询问许多不同的问题。

如果您对数据库没有太多经验,您应该找到一些关于关系数据库设计和使用的在线教程。关系数据库设计是一个非常有趣的主题,因为它对应用程序设计非常重要。