0

我在 android 中有一个应用程序,在服务器上有一个数据库,我在 django 中编写了 api。我希望我的应用程序可以在线和离线工作。到目前为止,我在 android 中做了本地数据库,api 以 json 格式返回查询结果。(数据库很简单,一张表,7个字段)。但我对数据库性能一无所知。我想知道是否一个好的策略是从表(从服务器)中获取所有行,从本地数据库中删除所有行,并将所有新行保存到本地数据库?或者更新现有行中的所有字段?或者也许在线/离线应用程序不是一个好主意?从服务器上的数据库下载 1000 行需要多长时间?也许这是个愚蠢的问题,但实际上,我正在寻找解决方案;)

我在 Django 中的模型如下所示:

class Quote(models.Model):
    user = models.ForeignKey(User)
    quote = models.TextField(verbose_name="Quotation")
    accepted = models.BooleanField(default=False, verbose_name="Accepted")
    deleted = models.BooleanField(default=False, verbose_name="Deleted")
    date = models.DateTimeField(verbose_name="Date", auto_now=True)
    good = models.PositiveIntegerField(default=0, verbose_name="Rate good")
    bad = models.PositiveIntegerField(default=0, verbose_name="Rate bad")

class Favourite(models.Model):
    user = models.ForeignKey(User)
    quote = models.ForeignKey(Quote)

我只通过 json 表发送报价(用户名、报价、接受、删除、日期、好、坏)。一个api函数:

@csrf_exempt
def api(request):
    if request.method == 'POST':
        operation = request.POST['operation']
        print 'operation', operation
        response_data = {}
        response_data['result'] = 'FAILED'

        if operation == 'getFive':
            itemsList = []
            ID = int(request.POST['id'])

            if ID == -1:
                querySet = Quote.objects.filter(deleted=False).order_by('-id')[:5]
            else:
                querySet = Quote.objects.filter(id__lt=ID, deleted=False).order_by('-id')[:5]

            maxID = Quote.objects.filter(deleted=False).order_by('-id')[0].id
            minID = Quote.objects.filter(deleted=False).order_by('id')[0].id

            for item in querySet:
                tmp = {}
                tmp['id'] = item.id
                tmp['username'] = item.user.username
                tmp['quote'] = item.quote
                tmp['accepted'] = item.accepted
                tmp['deleted'] = item.deleted
                tmp['date'] = dateformat.format(item.date, "Y-m-d H:i:s")
                tmp['good'] = item.good
                tmp['bad'] = item.bad
                itemsList.append(tmp)
                print item.id, item.quote
            response_data['result'] = 'SUCCESS'
            response_data['items'] = itemsList
            response_data['maxID'] = maxID
            response_data['minID'] = minID

            response_data['items'] = itemsList
        return HttpResponse(json.dumps(response_data), content_type="application/json")
    return redirect("/")

我的问题是我不想让用户等待很长时间来运行应用程序,而且我不知道智能手机可以通过 HSDPA/3G/LTE 等下载多长时间的数据。表中大约有 1000 行。假设一行有大约 1500 个字符。如果我算得好,它是 1500 B * 1000 行 = 1500000 字节 = 1464 KB = ~1,42 MB...所以我认为这很多,但我不是专家。

我忘了补充,当行“已删除”=True 时,我不会将其发送到智能手机。

还有我的问题:每次应用程序启动时,将所有行从服务器发送到 android 应用程序,是个好主意吗?

谢谢,对不起我的英语;)。

4

1 回答 1

0

我可以为你解释一个解决方案,但我不能真正告诉你如何去做。

  1. 如果用户第一次打开您的应用程序,您只想获取所有行。因此,如果您的本地数据库不存在,您将进行更新。
  2. 当你这样做时,你会希望它在后台,这样用户就可以继续并开始浏览你的应用程序。也许干杯以显示后台线程正在下载记录,这可能需要一段时间。
  3. 用光标分解下载,一次只下载 x 条记录。下载 50 并返回,下载 50 并返回。这样用户就可以看到正在下载的记录,而不必等到所有记录都返回。
于 2013-10-15T18:07:45.147 回答