Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite模型类的良好实践?_Android_Android Sqlite_Android Room - Fatal编程技术网

Android SQLite模型类的良好实践?

Android SQLite模型类的良好实践?,android,android-sqlite,android-room,Android,Android Sqlite,Android Room,在SQLiteOpenHelper(和Room)的示例中,定义了一个Java“model”类(例如Customer.Java)来表示数据库中的一个表。对于简单的查询,例如“SELECT*fromcustomer”,我可以看到创建Customer.java类是多么有用。但是,一个查询组合来自多个表(例如,Order&Customer)的数据,或者一个返回汇总数据记录的聚合查询。。。当您的查询将来自多个表的信息连接在一起,并且结果记录结构是来自多个表的字段的mashup时,“model”类很快开始降

在SQLiteOpenHelper(和Room)的示例中,定义了一个Java“model”类(例如Customer.Java)来表示数据库中的一个表。对于简单的查询,例如“SELECT*fromcustomer”,我可以看到创建Customer.java类是多么有用。但是,一个查询组合来自多个表(例如,Order&Customer)的数据,或者一个返回汇总数据记录的聚合查询。。。当您的查询将来自多个表的信息连接在一起,并且结果记录结构是来自多个表的字段的mashup时,“model”类很快开始降级

模型类结构/命名是否有一个标准或良好的实践,它在Java代码中清晰地反映了返回表的结构(例如:带有SelectAllCustomerOrdersRecord类的SelectAllCustomerOrders()方法?)。非常感谢他人所做的一切

对于模型类结构/命名,是否有一个标准或良好的实践可以在Java代码中清晰地反映返回表的结构

例如,您将有一个Customer类和一个Order类,订单将与客户相关。因此,您不能拥有CustomerOrders类,或者也可以选择CustomerWithOrders类。这些将是POJO而不是实体(表)

mashup是通过利用@Embedded注释和@Relation注释来克服的

下面是一个使用客户和订单的示例:-

实体客户订单

@Entity
class Customer {
    @PrimaryKey
    Long customerId;
    String customerName;
    String customerUnitNumber;
    String customerAddress;
    String customerPostalCode;
    // etc

    Customer() {}
    @Ignore
    Customer(String customerName, String customerUnitNumber, String customerAddress, String customerPostalCode) {
        this.customerId = null;
        this.customerName = customerName;
        this.customerUnitNumber = customerUnitNumber;
        this.customerAddress = customerAddress;
        this.customerPostalCode = customerPostalCode;
    }

    ....
}

根据上述情况,客户订单可以是:-

class CustomerOrders {
    @Embedded
    Customer customer;
    @Relation(entity = Order.class, parentColumn = "customerId", entityColumn = "customerReference")
    List<Order> orderList;
}

然后考虑以下内容(在主线程上运行简洁和方便):-< /P> 我认为以上内容都很整洁,而不是混搭

然而,事情开始变得稍微复杂一点的地方是,例如,如果你想得到客户和他们的订单,但只有当数量是特定数量或大于或小于某个数量时

使用:-

@Query("SELECT * FROM customer WHERE quantity = :x")
List<CustomerOrders> CustomerWithOrdersOfX(int x);
预期只提取订单ID 20(数量为4),因为这是唯一的订单ID为4

但是,@Relation获取属于@Embedded的所有子项。要克服这个问题,事情就可以开始混搭了

@Dao
interface AllDao {

    @Insert
    long insertCustomer(Customer customer);
    @Insert
    long[] insertManyCustomers(Customer...customers);
    @Insert
    long insertOrder(Order order);
    @Insert
    long[] insertManyOrders(Order...orders);

    @Query("SELECT * FROM customer")
    List<Customer> getAllCustomers();
    @Query("SELECT * FROM customer WHERE customerId = :customerId")
    Customer getCustomerById(long customerId);
    @Query("SELECT * FROM `order`")
    List<Order> getAllOrders();
    @Query("SELECT * FROM `order` WHERE orderId = :orderId")
    Order getOrderById(long orderId);

    @Query("SELECT count(*) FROM customer")
    long getCustomerCount();
    @Query("SELECT count(*) FROM `order`")
    long getOrderCount();

    @Query("SELECT * FROM customer")
    List<CustomerOrders> getAllCustomersWithTheirOrders();
    @Query("SELECT * FROM customer WHERE customerId = :customerId")
    CustomerOrders getCustomerWithAllOrders(long customerId);

}
@Database(entities = {Customer.class,Order.class},version = 1)
abstract class TheDatabase extends RoomDatabase {
    abstract AllDao getAllDao();
}
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "DBINFO";
    TheDatabase db;
    AllDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = Room.databaseBuilder(this,TheDatabase.class,"thedatabase.db")
                .allowMainThreadQueries()
                .build();
        dao = db.getAllDao();

        // Add some data
        long[] customersAdded = dao.insertManyCustomers(
                new Customer("Fred","Unit x","Blah Street","1234"),
                new Customer("Mary","Unit Z","Other Lane","4321")
                );
        for(long customerId: customersAdded) {
            int limit = (new Random()).nextInt(10) + 1;
            for(int ii = 0; ii < ((new Random()).nextInt(10) + 1); ii++) {
                dao.insertOrder(new Order(customerId,5));
            }
        }

        // Get counts writing them to the log
        Log.d(TAG,"There are " + dao.getCustomerCount() + " customers in the Database");
        Log.d(TAG,"There are " + dao.getOrderCount() + " orders in the Database");
        // Get Customers with their orders writing info to the log
        for(CustomerOrders co: dao.getAllCustomersWithTheirOrders()) {
            Log.d(TAG,"Customer is " + co.customer.customerName + " " + co.customer.getCustomerUnitNumber() + " etc.");
            for(Order o: co.orderList) {
                 Log.d(TAG,"Order Id is " + o.getOrderId());
            }
        }
    }
}
2021-05-08 07:09:14.183 D/DBINFO: There are 2 customers in the Database
2021-05-08 07:09:14.184 D/DBINFO: There are 7 orders in the Database
2021-05-08 07:09:14.189 D/DBINFO: Customer is Fred Unit x etc.
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 1
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 2
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 3
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 4
2021-05-08 07:09:14.189 D/DBINFO: Customer is Mary Unit Z etc.
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 5
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 6
2021-05-08 07:09:14.189 D/DBINFO: Order Id is 7
@Query("SELECT * FROM customer WHERE quantity = :x")
List<CustomerOrders> CustomerWithOrdersOfX(int x);
AllDao.java:41: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: quantity)
List<CustomerOrders> CustomerWithOrdersOfX(int x);
@Query("SELECT * FROM customer JOIN `order` ON `order`.customerReference = customerId WHERE quantity = :x")
List<CustomerOrders> getCustomersWithOrdersOfX(int x);
D/DBINFO: Number of Customers with Orders that have a quantity of 4 is 1
D/DBINFO: Customer = Mary
D/DBINFO: OrderID is 18 Qnty = 0
D/DBINFO: OrderID is 19 Qnty = 1
D/DBINFO: OrderID is 20 Qnty = 4
D/DBINFO: OrderID is 21 Qnty = 2
D/DBINFO: OrderID is 22 Qnty = 0