具有复杂数据库的Android应用程序结构

时间:2016-03-31 07:09:50

标签: android node.js mongodb android-volley android-syncadapter

善待这是我在StackOverflow上的第一个问题:p。我希望它足够具体。

以下是项目的结构

  1. 使用NodeJS和MongoDB(mongoose用于建模数据库模式)使用Express服务器构建的REST API。
  2. Android应用
  3. 使用AngularJS的网络应用
  4. 我的问题是如何构建Android应用和REST API之间的数据同步。以下几点为整个方案带来了清晰度 -

    • 数据库模型(在服务器上)非常复杂,每个数据库模型都有多个子文档。
    • 大约有6到7个型号相互参照。
    • 我目前正在使用Volley从远程服务器获取数据。
    • 我也在考虑添加一个SyncAdapter来定期同步数据,并且不确定如何将其与本地数据库合并。我应该为数据库中的每个表/模型使用不同的ContentProvider吗?以及如何在本地处理嵌套模式(在远程服务器中)?

    总结一下我的问题,我真正想知道的是,每天每位用户每天约有15-20个请求,每天约有100,000名用户,最好的方法是 -

  5. 使用volley完成我的所有数据库工作。
  6. 使用本地数据库(SQLite)和SyncAdapter来自动保持数据同步?如果是这种情况,您可以推荐一些资源来更好地了解如何将复杂数据库与SyncAdapter集成。
  7. 您建议用于构建此应用的任何其他内容。
  8. 要展示应用程序的复杂性,请查看下面的模型

    这是用户模型

    hashT[][], hashS[]
    
    i = rand(), j = rand();
    
    for(int k = i;k < i + lengthOfColumn(p);i++){
        if((hashT[i][j + lengthOfRow(p)] - hashT[i][j-1]) != hashP[i]){
            //patter does not match.
            return false;
        }
    }
    

    这是书籍模型

    var AddressSchema = new Schema({
        name: String,
        address: String,
        mobile: String,
        pincode: String,
        city: String,
        state: String
    });
    
    var CartSchema = new Schema({
        book: { type: Schema.Types.ObjectId, ref: 'Book' },
        quantity: {
            type: Number,
            default: 1
        },
        dateAdded: Date
    });
    
    var WishlistSchema = new Schema({
        book: { type: Schema.Types.ObjectId, ref: 'Book' },
        dateAdded: Date
    });
    
    var OrderSchema = new Schema({
        orderNumber: String,
        cart: [CartSchema],
        totalAmount: Number,
        deliveryCharge: Number,
        discountAmount: Number,
        address: [AddressSchema],
        date: Date,
        deliveryDate: Date,
        deliveryStatus: String
    });
    
    var SellOrderSchema = new Schema({
        orderNumber: String,
        bookDetails: [{
            isbn: String,
            title: String,
            quantity: {
                type: Number,
                default: 1
            }
        }],
        address: [AddressSchema],
        date: {
            type: Date,
            default: Date.now()
        }
    });
    
    var ReceivedOrdersSchema = new Schema({
        orderNumber: String,
        bookDetails: [{
            book: { type: Schema.Types.ObjectId, ref: 'Book' },
            quantity: Number,
            price: Number
        }],
        dueDate: Date,
        status: {
            type: String,
            default: 'Pending'
        }
    });
    
    var CouponSchema = new Schema({
        coupon: [{ type: Schema.Types.ObjectId, ref: 'Coupon' }],
        used: Number,
        totalDiscount: Number
    });
    
    var UserSchema = new Schema({
        name: String,
        email: { type: String, lowercase: true },
        role: {
            type: String,
            default: 'user'
        },
        hashedPassword: String,
        provider: String,
        salt: String,
        facebook: {},
        twitter: {},
        google: {},
        github: {},
        usedCoupons: [CouponSchema],
        cart: [CartSchema],
        wishlist: [WishlistSchema],
        orders: [OrderSchema],
        sellOrders: [SellOrderSchema],
        addresses: [AddressSchema],
        booksToSell: [{ type: Schema.Types.ObjectId, ref: 'Book' }],
        receivedOrders: [ReceivedOrdersSchema]
    });
    

    还有5-6个其他相互依赖的模型

1 个答案:

答案 0 :(得分:0)

静态数据

像UserTable这样的数据大多是静态的,因此您可以将其存储在SQLite(甚至共享首选项)中,以便快速进行本地数据访问。关于书籍(标题,作者等)的存储数据也非常静态(我不认为作者经常改变)因此在SQLite中缓存它很容易和直接。

动态数据

缓存动态数据?很难,没用,但如果你必须使用Volley,它会帮助你很多。 Volley使用ExpireLast-Modified等HTTP标记缓存您的回复。您的应用会发送一个包含时间戳的If-Modified-Since标记的HTTP请求。如果自该时间戳以来服务器中的数据发生了更改,您将收到正常响应。否则,您将收到HTTP 304 Not Modified,您可以使用旧的缓存数据。在这两种情况下,您的app都会保存当前时间戳并在下次使用。所有这些都是由Volley处理并且对你隐瞒,但知道很有用。你必须弄清楚如何在服务器端处理这个问题。如果您不希望服务器处理多个连接,您可以先显示用户缓存的数据,然后实现一个发送请求的Pull to Request手势。

离线访问

当应用程序无法访问互联网时,Volley为您提供了一个抽象层,但您应该为用户添加一个清晰的视觉指示器,以便他们知道您展示的任何内容都可以在其间。

总而言之,您应该根据数据的变化频率划分数据,并根据采用不同的策略进行划分。如果知道,请指定截止期限或截止日期。