【问题标题】:I have the Database bur error: SQL(query) error or missing database我有数据库 bur 错误:SQL(查询)错误或缺少数据库
【发布时间】:2019-04-26 14:34:31
【问题描述】:

我创建了一个数据库没有问题,我可以显示它手动添加数据,但是在 if else 方法中它没有添加任何值,我可以在日志中看到适合 if 方法的值但我认为问题是execSQL方法我不能调用它。

在我用 // 行标记的第二个代码的底部附近

错误:

android.database.sqlite.SQLiteException: near "s": syntax error (code 1): , while compile: INSERT INTO myTable1(id, FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate) VALUES(NULL,'Starbucks's','2019- 04-01','2019-04-19'); ################################################# ############### 错误代码:1(SQLITE_ERROR) 原因:SQL(查询)错误或缺少数据库。 (“de”附近:语法错误(代码 1):,编译时:INSERT INTO myTable1(id, FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate) VALUES(NULL,'Starbucks's','2019-04-01','2019-04- 19');) ################################################# ############### 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1062)

代码:

public void DBCreateFavCampaign(){
    SQLITEDATABASEFavCampaign = openOrCreateDatabase("FavCampaign3", Context.MODE_PRIVATE, null);
    SQLITEDATABASEFavCampaign.execSQL("CREATE TABLE IF NOT EXISTS myTable1(id INTEGER PRIMARY KEY AUTOINCREMENT, FAVCampaignName VARCHAR,FAVCampaigncampaignStartDate VARCHAR, FAVCampaigncampaignEndDate VARCHAR);");
}

代码2:

public void readFirestore() {
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("campaigns")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                private String FSname,FScityLAT,FScityLONG,FScampaignStartDate,FScampaignEndDate;

                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful() && task.getResult() != null) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            String name = document.getString("name");
                            String cityLAT = document.getString("cityLAT");
                            String cityLONG = document.getString("cityLONG");
                            String campaignStartDate = document.getString("campaignStartDate");
                            String campaignEndDate = document.getString("campaignEndDate");

                            this.FSname = name;
                            this.FScityLAT = cityLAT;
                            this.FScityLONG = cityLONG;
                            this.FScampaignStartDate = campaignStartDate;
                            this.FScampaignEndDate = campaignEndDate;

                            String FS_FAVCurrentLocationLAT = List_FAVCurrentLocationLAT;
                            String FS_FAVCurrentLocationLONG = List_FAVCurrentLocationLONG;

                            double FS_FAVCurrentLocationLAT_double = Double.parseDouble(FS_FAVCurrentLocationLAT); 
                            double FS_FAVCurrentLocationLONG_double = Double.parseDouble(FS_FAVCurrentLocationLONG); 

                            double FScityLAT_double = Double.parseDouble(FScityLAT);  
                            double FScityLONG_double = Double.parseDouble(FScityLONG); 


                            double theta = FScityLONG_double - FS_FAVCurrentLocationLONG_double;
                            double dist = Math.sin(Math.toRadians(FS_FAVCurrentLocationLAT_double)) * Math.sin(Math.toRadians(FScityLAT_double)) + Math.cos(Math.toRadians(FS_FAVCurrentLocationLAT_double)) * Math.cos(Math.toRadians(FScityLAT_double)) * Math.cos(Math.toRadians(theta));
                            dist = Math.acos(dist);
                            dist = Math.toDegrees(dist);
                            dist = dist * 60 * 1.1515;
                            dist = dist * 1.609344;

                            Log.i("hello",""+dist); //OK it writes to the log


                            if (dist <= 0.5) // 
                            {
                                Log.i("near",""+dist); // Ok
                                DBCreateFavCampaign();

                                SQLiteQueryFavCampaign = "INSERT INTO myTable1(id, FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate) VALUES(NULL,'"+FSname+"','"+FScampaignStartDate+"','"+FScampaignEndDate+"');";
                                SQLITEDATABASEFavCampaign.execSQL(SQLiteQueryFavCampaign); //execSQL gives the error

                                Toast.makeText(CampaignActivity.this,"FAV OK", Toast.LENGTH_SHORT).show();
                            }
                        }
                    } else {
                    }
                }
            });
}

【问题讨论】:

  • 看在上帝的份上,请使用PreparedStatements,不要将值直接写入数据库。

标签: java android sqlite


【解决方案1】:

FAVCampaignName 包含一个单引号,因此数据库认为该字符串以 köy' 结尾并且不知道如何处理 de...

'Starbucks's 2.kahve %50 indirimli'

要么使用 \ 转义所有单引号,要么使用参数化查询。

【讨论】:

  • 先生,非常感谢您
【解决方案2】:

'Starbucks's'...

如果你注意到 sql 认为你用那个字符 ' 完成了你的字符串。尝试删除它。 Sqlite 认为你的字符串是:Starbucks 然后de s 是语法错误。

请在该字符串中添加\' 而不是',您就可以了。

【讨论】:

  • 好的,如果您得到答案,请将答案更新为已解决
  • 是的,先生,我是该网站的新手,再次感谢您拯救了我的一天。
  • 先生,再次感谢您我检查了您的回答,我做了什么不尊重的事情吗?正如我所说,我是新人,我非常尊重你,再次感谢你
  • 不不,别担心。祝你好运。如果您想了解 SO 的工作原理,请参阅链接 here
【解决方案3】:

正如其他答案所说,问题在于变量FSname 的值是"Starbucks's",其中包含一个引号。这会导致 SQL 引擎将该值解释为 "Starbucks",并且由于无法解析字符串的其余部分,因此会导致错误。

尝试通过以下方式更改查询:

SQLiteQueryFavCampaign = "INSERT INTO myTable1(id, FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate) VALUES(NULL,\""+FSname+"\",'"+FScampaignStartDate+"','"+FScampaignEndDate+"');";

请注意,我将FSname 旁边的单引号替换为双引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多