【问题标题】:android - getting all rows from external database - good idea?android - 从外部数据库获取所有行 - 好主意吗?
【发布时间】:2013-09-16 22:57:57
【问题描述】:

我在 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...所以我认为这很多,但我不是专家。

我忘了补充,当行'deleted'=True时,我不会将其发送到智能手机。

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

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

【问题讨论】:

  • 最简单的解决方案就是最好的。除非你展示一些真实的东西(代码、分析结果),否则很难回答这个问题。

标签: android mysql sql database django


【解决方案1】:

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

  1. 您只想在用户第一次打开您的应用程序时获取所有行。因此,如果本地数据库不存在,您将进行更新。
  2. 当您执行此操作时,您会希望它位于后台,以便用户可以继续浏览您的应用程序。或许可以举杯来显示后台线程正在下载记录,这可能需要一段时间。
  3. 使用光标中断下载,一次只下载 x 条记录。下载 50 并返回,下载 50 并返回。这样用户就可以看到正在下载的记录,而不必等到所有记录都返回。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2019-05-25
    • 2016-06-28
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多