Сбой при попытке получить идентификатор "android.database.sqlite.SQLiteException: near"

привет, я очень новичок в программировании на Android и часами был в тупике из-за ошибки. Что должно произойти, так это то, что после загрузки всех цитат из моей таблицы, если я нажму на одну из них, он должен передать идентификатор новому фрагменту и снова загрузить его на фрагмент. Но в конце концов, когда я нажимаю цитату, я получаю сообщение об ошибке, указывающее на мой метод getItemID в моем классе DatabaseHelper. Ошибка, которую я получаю, я получаю -

android.database.sqlite.SQLiteException: near "SELECTIDFROMQuote_TableWHEREQuote": syntax error (code 1): , while compiling: SELECTIDFROMQuote_TableWHEREQuote = 'Play it, Sam. Play 'As Time Goes By.' 

затем укажите на - getItemID (DatabaseHelper.java:78)

любая помощь поможет большое спасибо.

(это действие, которое содержит listFragments и favourfulFragment)

import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class FavoriteActivity extends AppCompatActivity {


final String LOG_TAG = FavoriteActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_favorite);


    Log.e(LOG_TAG, "youre now in FavoriteActivity ");


    FavoriteListFragment newFragment = new FavoriteListFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.favorite_Container, newFragment);
    // Commit the transaction
    transaction.commit();


}

}

(это фрагмент, который загружается после того, как вы нажмете на цитату из списка) (Здесь у меня проблемы с идентификатором)

public class FavoriteFragment extends Fragment {

DatabaseHelper mDatabaseHelper;
private String selectedQuote;
private int selectedID;
private TextView savedQuoteView;
final String LOG_TAG = FavoriteFragment.class.getSimpleName();

public FavoriteFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.e(LOG_TAG, "youre now in FavoriteFragment ");

    Bundle openBundle = getArguments();
    selectedID = openBundle.getInt("ID", -1);
    String selectedQuote = openBundle.getString("quote", "empty");
    mDatabaseHelper = new DatabaseHelper(getActivity());
    View view = inflater.inflate(R.layout.fragment_favorite, container, false);
    Button deleteBtn = (Button) view.findViewById(R.id.deleteButton);

    deleteBtn.setOnClickListener(new AdapterView.OnClickListener() {

        @Override
        public void onClick(View v) {
            // Log.e(LOG_TAG, "selectedID : " + selectedID + " selectedQuote : " + selectedQuote);
            mDatabaseHelper.deleteQuote(selectedID, selectedQuote);
            savedQuoteView.setText("");
            FavoriteListFragment favoriteListFragment = new FavoriteListFragment();
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.favorite_Container, favoriteListFragment);
            // Commit the transaction
            transaction.commit();
            Toast.makeText(getActivity(), "removed from database", Toast.LENGTH_SHORT).show();

        }
    });

    savedQuoteView = (TextView) view.findViewById(R.id.savedQuote);
    savedQuoteView.setText(selectedQuote);

    return view;
}}

(это listFragment, который показывает мою таблицу)

import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;


public class FavoriteListFragment extends Fragment {

private static final String LOG_TAG = "FavoriteListFragment";
private ListView listView;
DatabaseHelper mDatabaseHelper;

public FavoriteListFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    // final String LOG_TAG = FavoriteActivity.class.getSimpleName();
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_favorite_list, container, false);
    listView = view.findViewById(android.R.id.list);
    mDatabaseHelper = new DatabaseHelper(getActivity());
    //Log.e(LOG_TAG, "mDataBaseHelper: " + mDatabaseHelper);
    Log.e(LOG_TAG, "you're now in FavoriteListFragment ");
    // Log.e(LOG_TAG, "this is your list view " + listView);
    populateListView();
    return view;
}

private void populateListView() {
    Log.d(LOG_TAG, "youre in populateListView");

    //get the data and append to a list
    Cursor data = mDatabaseHelper.getAllQuotes();
    ArrayList<String> listData = new ArrayList<>();
    while (data.moveToNext()) {
        //get the value from the database in column 1
        //then add it to the ArrayList
        listData.add(data.getString(1));
    }


    //create the list adapter and set the adapter
    ListAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, listData);
    listView.setAdapter(adapter);

    //set an onItemClickListener to the ListView
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String quote = adapterView.getItemAtPosition(i).toString();

            Cursor data = mDatabaseHelper.getItemID(quote); //get the id associated with that name
            int itemID = -1;
            while (data.moveToNext()) {
                itemID = data.getInt(0);
                Log.d(LOG_TAG, "onItemClick: You Clicked on " + quote);
            }
            if (itemID > -1) {

                Log.d(LOG_TAG, "onItemClick: The ID is: " + itemID);
                FavoriteFragment newFragment = new FavoriteFragment();

                Bundle args = new Bundle();
                args.putInt("ID", itemID);
                args.putString("quote", quote);
                newFragment.setArguments(args);

                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.favorite_Container, newFragment);
                transaction.commit();

            } else {
                Toast toast = Toast.makeText(getActivity(), "No ID associated with that name", Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    });
}
}

(Это обработчик, который я использую)

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String LOG_TAG = "DatabaseHelper";
private static final String TABLE_NAME = "Quote_Table";
private static final String COL0 = "ID";
private static final String COL1 = "Quote";


public DatabaseHelper(Context context) {
    super(context, TABLE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL1 + " TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int v1, int v2) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean addData(String item) {
    SQLiteDatabase dataBase = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL1, item);

    long result = dataBase.insert(TABLE_NAME, null, values);

    //if date as inserted incorrectly it will return -1
    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

/**
 * Returns all the data from database
 */
public Cursor getAllQuotes() {
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME;
    Cursor data = db.rawQuery(query, null);
    return data;
}

/**
 * Returns only the ID that matches the name passed in
 */

public Cursor getItemID(String quote) {
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT " + COL0 + " FROM " + TABLE_NAME +
            " WHERE " + COL1 + " = '" + quote + "'";
    Cursor data = db.rawQuery(query, null);
    return data;
}

/**
 * Delete from database
 *
 * @param id
 * @param quote
 */
public void deleteQuote(int id, String quote) {
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "DELETE FROM " + TABLE_NAME + " WHERE "
            + COL0 + " = '" + id + "'" + " AND " + COL1 + " = '" + quote + "'";
    Log.d(LOG_TAG, "deleteName: query: " + query);
    Log.d(LOG_TAG, "deleteName: Deleting " + quote + " from database.");
    db.execSQL(query);
}

}

(в случае, если вы хотите увидеть, что logcat сказал):

  randomquote.hfad.com.randomquote.DatabaseHelper.getItemID(DatabaseHelper.java:71)
     at 

 randomquote.hfad.com.randomquote.FavoriteListFragment$1.onItemClick(FavoriteListFragment.java:72)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
34
1

Ответы 1

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

В качестве такового попробуйте использовать следующее: -

public Cursor getItemID(String quote) {
    SQLiteDatabase db = this.getWritableDatabase();

    String[] columns = new String[]{COL0};
    String whereclause = COL1+"=?";
    String[] whereargs = new String[]{quote};

    return db.query(TABLE_NAME,columns,whereclause,whereargs,null,null,null);

}
  • Обратите внимание, что это принципиальный код, который не тестировался, поэтому может содержать ошибки.

Другие вопросы по теме