GVKun编程网logo

Android SQLite ORDER BY不起作用

1

最近很多小伙伴都在问AndroidSQLiteORDERBY不起作用这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展""需要有字段"id"的值才能使用这种多对多关系、01.SQLi

最近很多小伙伴都在问Android SQLite ORDER BY不起作用这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展"" 需要有字段 "id" 的值才能使用这种多对多关系、01.SQLite 教程(http://www.w3cschool.cc/sqlite/sqlite-tutorial.html)、3表联接与SUM和GROUP BY不起作用、android-sqlite – Android :: SQLite,没有找到这样的列?等相关知识,下面开始了哦!

本文目录一览:

Android SQLite ORDER BY不起作用

Android SQLite ORDER BY不起作用

我有一个非常基本的情况:

我有一个大约5k行的表:

CREATE TABLE "words" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,"name" TEXT NOT NULL,"def" TEXT NOT NULL,"rand" INTEGER)

我使用“UPDATE words SET rand = random()”定期更新

在android中,当我使用rawQuery()使用以下内容创建游标时:

SELECT w.id,w.name,w.def,w.rand FROM words w ORDER BY w.rand ASC;

返回的游标不按正确的顺序迭代.例如.它将按以下顺序输出具有rand值的列:

-1298882092
-2138143484
-1115732861
118839193
...

有谁知道这里发生了什么?这不应该工作吗?如果我在sqliteManager中运行完全相同的查询,它会以正确的顺序返回结果,所以这似乎是特定于android / cursor的.

更新:

这是android中的代码,我尝试了多种方法:

尝试1:

Cursor cursor = db.rawQuery("SELECT w.id,w.rand FROM words w ORDER BY w.rand ASC",new String[]{});

尝试2:

Cursor cursor = db.query("words",new String[]{"id","name","def","rand"},null,"rand ASC");

在这两种情况下,我迭代如下:

while(cursor.movetoNext()) {
    ...
    Log.i("Test",cursor.getInt(3));
    ...
}

解决方法

我解决了它,是一个简单的疏忽. random()函数返回的值可以大于java int数据类型.这产生溢出.切换到getLong(),一切正常.光标一直在正确迭代.

" 需要有字段 "id" 的值才能使用这种多对多关系" alt=""" 需要有字段 "id" 的值才能使用这种多对多关系">

" 需要有字段 "id" 的值才能使用这种多对多关系">"" 需要有字段 "id" 的值才能使用这种多对多关系

如何解决"<Order: Order object (None)>" 需要有字段 "id" 的值才能使用这种多对多关系

所以我试图将多个产品或订单项目添加到一个订单中,我为此使用了多对多关系,但是当我尝试创建该订单时,我收到 "<Order: Order object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used. 错误,我的添加代码并保存该订单就像:

  1. userObject = UserLogin.objects.get(token=finalUserToken).user
  2. objects = OrderItem.objects.filter(user=userObject)
  3. FinalOrder = Order(user=userObject,order_id=another_token)
  4. for orderObject in objects:
  5. FinalOrder.products.add(orderObject.id)
  6. FinalOrder.save()

错误画面指向这一行

  1. FinalOrder.products.add(orderObject.id)

我也试过这个

  1. FinalOrder.products.add(orderObject)

但这也给出了相同的结果

models.py

  1. class OrderItem(models.Model):
  2. item_id = models.CharField(max_length=20)
  3. user = models.ForeignKey(User,on_delete=models.CASCADE)
  4. quantity = models.IntegerField()
  5. product = models.ForeignKey(Product,on_delete=models.DO_nothing)
  6. def __str__(self):
  7. return self.product.name
  8. class Order(models.Model):
  9. order_id = models.CharField(max_length=20)
  10. user = models.ForeignKey(User,on_delete=models.CASCADE)
  11. products = models.ManyToManyField(OrderItem)
  12. def __str__(self):
  13. return self.user.username

解决方法

您需要在循环之前调用save()方法

  1. userObject = UserLogin.objects.get(token=finalUserToken).user
  2. objects = OrderItem.objects.filter(user=userObject)
  3. FinalOrder = Order(user=userObject,order_id=another_token)
  4. FinalOrder.save() # call the `save()` method here
  5. for orderObject in objects:
  6. FinalOrder.products.add(orderObject.id)

或者,您可以使用 list-unpacking

提交 for loop 的用法
  1. userObject = UserLogin.objects.get(token=finalUserToken).user
  2. objects = OrderItem.objects.filter(user=userObject)
  3. FinalOrder = Order(user=userObject,order_id=another_token)
  4. FinalOrder.save()
  5. FinalOrder.products.add(*objects)

01.SQLite 教程(http://www.w3cschool.cc/sqlite/sqlite-tutorial.html)

01.SQLite 教程(http://www.w3cschool.cc/sqlite/sqlite-tutorial.html)

sqlite教程

sqlite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 sql 数据库引擎。sqlite 是在世界上最广泛部署的 sql 数据库引擎。sqlite 源代码不受版权限制。

本教程将告诉您如何使用 sqlite 编程,并让你迅速上手。

现在开始学习 SQLite!

谁适合阅读本教程?

本教程有助于初学者了解 sqlite 数据库引擎相关的基础知识和先进理念。

阅读本教程前,你需要了解的知识:

在开始使用本教程提供的各类实例进行练习之前,您需要了解什么是数据库,尤其是 RDBMS,以及什么是计算机编程语言。

编译/执行 sqlite 程序

如果您想要通过 sqlite DBMS 编译/执行 sql 程序,但是您没有相关设置,那么可以访问compileonline.com。您只需进行简单的点击动作,即可在高端的服务器上体验真实的编程经验。这是完全免费的在线工具。

sqlite 函数参考手册

本教程提供了所有重要的内置的 sqlite 函数的参考手册。

SQLite 常用函数

sqlite 有用的资源

本教程列出了 sqlite 数据库网站和书籍。

sqlite 有用的网站

  • SQLite Home Page- sqlite 官方网站提供了最新的 sqlite 安装版本,最新的 sqlite 资讯以及完整的 sqlite 教程。

  • PHP SQLite3- 网站提供了 sqlite 3 数据库的 PHP 支持的完整细节。

  • SQLite JDBC Driver:- sqlite JDBC,由 Taro L. Saito 开发的,是一个用于 Java 中访问和创建 sqlite 数据库文件的库。

  • DBD-SQLite-0.31- sqlite Perl driver 驱动程序与 Perl DBI 模块一起使用。

  • DBI-1.625- Perl DBI 模块为包括 sqlite 在内的任何数据库提供了通用接口。

  • SQLite Python- sqlite3 python 模块由 Gerhard Haring 编写的。它提供了与 DB-API 2.0 规范兼容的 sql 接口。

sqlite 有用的书籍

3表联接与SUM和GROUP BY不起作用

3表联接与SUM和GROUP BY不起作用

我有三个要使用的表。

  1. AccountingLine-保存通用帐户详细信息
  2. 预算-保留每个AccountingLine的预算数据(每个AccountingLine多行)
  3. 实际-保留每个AccountingLine的实际成本数据(每个AccountingLine多行)

我试图在单个查询中获取结果,该查询将从AccountingLine表返回所有行,并从Budget和Actuals表中求和每个AccountingLine的金额。

使用下面的SQL,SUM不适用于预算或实际数据。如果删除联接之一和SUM函数之一,则它将为单个联接表正确计算。非常奇怪…在MySQL的三个或更多表上有人通过多个SUM函数遇到这个问题吗?

SELECT  A.*, SUM(B.`amount`) AS BudgetAmount, SUM(ACT.`amount`) as ActualAmount FROM accounting_line A LEFT JOIN budget B ON B.accounting_line_id = A.accounting_line_idLEFT JOIN actual ACT ON  ACT.accounting_line_id = A.accounting_line_idGROUP BY A.`accounting_line_id`

通过发布上面的声明,我希望看到accounting_line字段,每个accounting_line的预算金额之和和每个accounting_line的实际金额之和。

我到处搜索,找不到多个SUM函数的实例。非常感谢您的任何建议。

乔希

表数据如下:

    Table: AccountingLine      act_line_id   department    ----------------------------------                  1   Sales                   2   HumanResourcesTable: Budget        budget_id   actg_line_id     amount    ----------------------------------------------                  1              1          3500.00                2              2          5000.00                3              2          15000.00Table: Actual        actual_id   actg_line_id     amount    ----------------------------------------------                  1              1        1000.00                2              2         500.00                3              2        9000.00

答案1

小编典典

Ajoin重复另一个表中的每个匹配行。因此,如果在三个表中有3行并将它们连接在一起,则最终将有9行。如果求和,第二张和第三张表的每个和都太高3倍。

一种解决方案是对子查询求和,以使join唯一的查询找到一行:

SELECT   A.*,        B.SumAmount as BudgetAmount,        ACT.SumAmount as ActualAmount FROM     accounting_line A LEFT JOIN         (        select  accounting_line_id        ,       sum(amount) as SumAmount        from    budget        group by                accounting_line_id        ) as BON      B.accounting_line_id = A.accounting_line_idLEFT JOIN         (        select  accounting_line_id        ,       sum(amount) as SumAmount        from    actual        group by                accounting_line_id        ) as ACT ON      ACT.accounting_line_id = A.accounting_line_id

android-sqlite – Android :: SQLite,没有找到这样的列?

android-sqlite – Android :: SQLite,没有找到这样的列?

嘿所有我是一个新手安卓,并希望对此有所帮助?

android.database.sqlite.sqliteException:没有这样的列:asd :,编译时:DELETE FROM标签WHERE name = asd

这是我面临的错误,这是代码:

这是DBhelper中的方法:

/**
 * Delete a label table
 * */
public void deleteLabel(String label) {
    sqliteDatabase db = this.getWritableDatabase();

    // ContentValues values = new ContentValues();
    // values.remove(label);

    // Deleting Row
    db.delete(TABLE_LABELS,KEY_NAME + "=" + label,null);
    db.close(); // Closing database connection
}

这是调用该方法的主要Activity代码:

// for spinner onItemListener
// and here is what label is

final String label = parent.getItemAtPosition(position).toString();

Button dialogDeletelButton = (Button) dialog
                .findViewById(R.id.deleteButton);
        dialogDeletelButton.setonClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // database handler
                DatabaseHandler db = new DatabaseHandler(
                        getApplicationContext());

                // inserting new label into database
                db.deleteLabel(label);

                // Hiding the keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(inputLabel.getwindowToken(),0);

                // loading spinner without the deleted data
                loadSpinnerData();

            }
        });

解决方法

您几乎肯定需要引用’asd'(即代码中的label变量).如果它被引用,它是一个与名称列进行比较的字符串.

如果它没有引用,sql只会将其视为另一个列名.

您可以在以下活动中执行以下操作:

db.deleteLabel ("'" + label + "'");

但是更改辅助函数可能更干净:

db.delete (TABLE_LABELS,KEY_NAME + "='" + label + "'",null);

因为看起来你可能想要在那里的某个点处使用未加引号的标签(当前被注释掉的ContentValues内容).

今天的关于Android SQLite ORDER BY不起作用的分享已经结束,谢谢您的关注,如果想了解更多关于"" 需要有字段 "id" 的值才能使用这种多对多关系、01.SQLite 教程(http://www.w3cschool.cc/sqlite/sqlite-tutorial.html)、3表联接与SUM和GROUP BY不起作用、android-sqlite – Android :: SQLite,没有找到这样的列?的相关知识,请在本站进行查询。

本文标签: