У меня ошибка базы данных bur: ошибка SQL (запрос) или отсутствует база данных - PullRequest
4 голосов
/ 26 апреля 2019

Я создал базу данных, проблем нет, я могу показать, что она добавляет данные вручную, но в методе if это не добавляет никакого значения, я вижу, что значения соответствуют методу if в журнале, но я думаю, что проблема в методе execSQL, я не могу его вызвать.

В нижней части второго кода, который я пометил // строкой

Ошибка:

android.database.sqlite.SQLiteException: около «s»: синтаксическая ошибка (код 1): при компиляции: INSERT INTO myTable1 (id, FAVCampaignName, FAVCampaigncampaignStartDate, FAVCampaigncampaignEndDate) VALUES (NULL, 'Starbu9' 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 {
                    }
                }
            });
}

Ответы [ 3 ]

5 голосов
/ 26 апреля 2019

FAVCampaignName содержит одиночную кавычку, поэтому база данных считает, что строка заканчивается на köy 'и не знает, что делать с де ...

'Starbucks's 2.kahve %50 indirimli'

Либо экранируйте все одинарные кавычки с помощью \, либо используйте параметризованный запрос.

2 голосов
/ 26 апреля 2019

Как говорят другие ответы, проблема в том, что значение вашей переменной FSname равно "Starbucks's", которое содержит символ кавычки.Это приводит к тому, что механизм SQL интерпретирует значение как "Starbucks", а оставшаяся часть строки не может быть проанализирована, что вызывает ошибку.

Попробуйте изменить запрос следующим образом:

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

Обратите внимание, что я заменил простые кавычки рядом с FSname на двойные кавычки.

2 голосов
/ 26 апреля 2019

'Starbucks's' ...

Если вы заметили, что sql думает, что вы закончили свою строку с этим символом 'там. Попробуйте удалить его. Sqlite считает, что ваша строка: Starbucks, а затем de s - синтаксическая ошибка.

В этой строке, пожалуйста, добавьте \' вместо ', и все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...