android - 从外部数据库获取所有行 - 好主意?

时间:2013-09-16 22:57:58

标签: android mysql sql database django

我在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应用的所有行都是个好主意?

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

1 个答案:

答案 0 :(得分:0)

我可以为你解释一个解决方案,但我无法真正告诉你如何做到这一点。

  1. 如果用户第一次打开您的应用,您只想获取所有行。因此,如果您的本地数据库不存在,您将进行更新。
  2. 当你这样做时,你会希望它在后台,所以用户可以继续开始你的应用程序。也许做一个toast来显示后台线程正在下载记录,这可能需要一段时间。
  3. 使用游标分解下载,一次只下载x条记录。下载50并返回,下载50并返回。这样,用户可以看到正在下载的记录,并且他们不必等到返回所有记录。