当前位置: 首页 > 知识库问答 >
问题:

编译时没有这样的表(代码 1 SQLITE_ERROR):选择song_no,song_title来自英语歌曲

苏华荣
2023-03-14

所以我正在关注这个视频 https://www.youtube.com/watch?v=7AxlMtksJUs

我正在尝试让 Sqlite 数据显示在回收站视图中的片段中。

我已经尽力复制它,到目前为止,在我运行它之前没有错误。

任何帮助将不胜感激,我相当新,我已经检查了所有的解决方案,似乎没有工作。

这是我最后的手段。

我打开Logcat,发现以下错误:

E/SQLiteLog: (1) no such table: EnglishSongs in "SELECT song_no, song_title FROM EnglishSongs"
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.gospelsongbook, PID: 3312
    android.database.sqlite.SQLiteException: no such table: EnglishSongs (code 1 SQLITE_ERROR): , while compiling: SELECT song_no, song_title FROM EnglishSongs

以下 2 个错误显示为蓝色:

at com.example.gospelsongbook.EngsongDatabaseAdapter.getAllEngsong(EngsongDatabaseAdapter.java:26)
at com.example.gospelsongbook.EnglishSongsFragment.onCreateView(EnglishSongsFragment.java:33)

这是我想在RecyclerView中显示数据的片段
EnglishSongsFragment.java:

public class EnglishSongsFragment extends Fragment {

    EngsongDatabaseAdapter engsongDatabaseAdapter;
    RecyclerView rvEnglish;
    RecyclerView.LayoutManager layoutManager;
    EngsongAdapter engsongAdapter;
    List<Engsong> engsongList = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_english_songs, container, false);

        DatabaseAccess.copyDB(requireActivity());
        engsongDatabaseAdapter = new EngsongDatabaseAdapter(getContext());
        engsongList = engsongDatabaseAdapter.getAllEngsong();
        rvEnglish = (RecyclerView) view.findViewById(R.id.rvEnglish);
        rvEnglish.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getContext());
        rvEnglish.setLayoutManager(layoutManager);
        engsongAdapter = new EngsongAdapter(getContext(), engsongList, rvEnglish);
        rvEnglish.setAdapter(engsongAdapter);
        return view;
    }
}

构造函数和Getter
Engsong.java

public class Engsong {

    private final long song_no;
    private final String song_title;

    public Engsong(long song_no, String song_title)
    {
        this.song_no = song_no;
        this.song_title = song_title;
    }

    public long getSong_no() {
        return song_no;
    }

    public String getSong_title() {
        return song_title;
    }

RecyclerView适配器
EngsongAdapter.java:

public class EngsongAdapter extends RecyclerView.Adapter<EngsongAdapter.ViewHolder> {

    Context context;
    List<Engsong> engsongList;
    RecyclerView rvEnglish;
    final View.OnClickListener onClickListener = new EngOnClickListener();

    public static class ViewHolder extends RecyclerView.ViewHolder
    {
        TextView rowEngsongno;
        TextView rowEngsongtitle;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            rowEngsongno = itemView.findViewById(R.id.eng_song_no);
            rowEngsongtitle = itemView.findViewById(R.id.eng_song_title);
        }
    }

    public EngsongAdapter (Context context, List<Engsong> engsongList, RecyclerView rvEnglish)
    {
        this.context = context;
        this.engsongList = engsongList;
        this.rvEnglish = rvEnglish;
    }


    @NonNull
    @Override
    public EngsongAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.single_item, parent, false);
        view.setOnClickListener(onClickListener);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull EngsongAdapter.ViewHolder holder, int position) {

        Engsong engsong = engsongList.get(position);
        holder.rowEngsongno.setText(""+engsong.getSong_no());
        holder.rowEngsongtitle.setText(engsong.getSong_title());

    }

    @Override
    public int getItemCount() {
        return engsongList.size();
    }

    private class EngOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {

            int itemPosition = rvEnglish.getChildLayoutPosition(view);
            String item = engsongList.get(itemPosition).getSong_title();
            Toast.makeText(context, item, Toast.LENGTH_SHORT).show();

        }
    }
}

数据库适配器
EngsongDatabaseAdapter.java:

public class EngsongDatabaseAdapter {

    DatabaseHelper helper;
    SQLiteDatabase db;
    List<Engsong> engsongList = new ArrayList<>();

    public EngsongDatabaseAdapter(Context context)
    {
        helper = new DatabaseHelper(context);
        db = helper.getWritableDatabase();
    }

    public List<Engsong> getAllEngsong()
    {
        String[] columns = {DatabaseHelper.KEY_ROWENGSONGNO, DatabaseHelper.KEY_ENGSONGTITLE};
        Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, columns, null,null,null,null, null, null);
        while(cursor.moveToNext())
        {
            int index1 = cursor.getColumnIndex(DatabaseHelper.KEY_ROWENGSONGNO);
            int rowsongno = cursor.getInt(index1);
            int index2 = cursor.getColumnIndex(DatabaseHelper.KEY_ENGSONGTITLE);
            String songtitle = cursor.getString(index2);
            Engsong engsong = new Engsong(rowsongno, songtitle);
            engsongList.add(engsong);
        }
        cursor.close();
        return engsongList;
    }

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        private static final String DATABASE_NAME = "GospelSongBookData.db";
        private static final String TABLE_NAME = "EnglishSongs";
        private  static final int DATABASE_VERSION = 5;
        private static final String KEY_ROWENGSONGNO = "song_no";
        private static final String KEY_ENGSONGTITLE = "song_title";
        private final Context context;

        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            this.context = context;
        }

        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {

        }

        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        }
    }

}

数据库访问:

public class DatabaseAccess {

    public static void copyDB(Context context)
    {
        try
        {
            String destPath = "/data/data/"+ context.getPackageName()
                    + "/databases";
            File f = new File(destPath);
            if(!f.exists()){
                f.mkdir();
                // Copy the db from assets folder into the databases folder
                rawCopy(context.getAssets().open("GospelSongBookData.db"), new FileOutputStream(destPath + "/GospelSongBookData.db"));
            }
        }
        catch (FileNotFoundException e)
        {
           e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public static void rawCopy(InputStream inputStream, OutputStream outputStream) throws IOException
    {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0)
        {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }
}

共有1个答案

余铭晨
2023-03-14

检查你的数据库助手你错过了CREATE_TABLE函数

请注意,根据数据库结构更改密钥。

 private static class DatabaseHelper extends SQLiteOpenHelper {
    
           
            private static final String CREATE_TABLE = "create table "+ TABLE_NAME+
                    " ("+ KEY_ROWID+" integer primary key autoincrement, "+ KEY_NAME + " text, "+ KEY_EMAIL+ " text)";
            private static final String DROP_TABLE = "drop table if exists "+ TABLE_NAME;
            private Context context;
    
            public DatabaseHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
                this.context = context;
                Toast.makeText(context, "constructor called", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                try{
                    //db.execSQL(CREATE_TABLE);
                    Toast.makeText(context, "onCreate called", Toast.LENGTH_SHORT).show();
                }catch (SQLException e){
                    Toast.makeText(context, ""+e, Toast.LENGTH_SHORT).show();
                }
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                try{
                    Toast.makeText(context, "onUpgrade called", Toast.LENGTH_SHORT).show();
                    //db.execSQL(DROP_TABLE);
                    //onCreate(db);
                }catch (SQLException e){
                    Toast.makeText(context, ""+e, Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
 类似资料:
  • 问题内容: 我正在尝试使用Docker使用此存储库为AWS Lambda创建一个依赖包,但是每当我尝试运行build.sh文件时,都会收到以下消息: 没有这样的选择:–use-wheel 然后,当我尝试使用(在Docker之外)时,我被告知它已经在我的本地计算机上了。 如何在Docker容器中安装Wheel? 如果有帮助,这似乎是build.sh中出现问题的代码行: 任何帮助深表感谢! 问题答案:

  • 关于StackOverflow有一些关于如何处理期货列表的建议,但我想尝试我自己的方法。但是我无法编译以下代码 我有一份未来的清单。我想数一数他们中有多少人及格或不及格。我应该得到(2,1),我将其存储在一个元组中。我想采取的方法是遍历列表中的每个元素。列表的元素是Future[Int]。对于每个元素,我调用flatMap,它调用下一个递归循环(我假设如果调用flatMap,那么特定的未来将是成功

  • 问题内容: 我正在使用Django-CMS的Django项目中构建一个相当简单的应用程序,即研究项目。(这是我对项目/应用程序的首次尝试。)它的主要目的是存储各种知识资产(例如,研究人员撰写的文章,书籍等)。 问题是,当我将浏览器指向/ research /时,出现一条错误,提示表’research_journal’不存在(“ no such table”)。 我正在使用带有sqlite3数据库的

  • 问题内容: 我遵循的是官方Django文档中的第一个应用程序教程,尝试保存通过管理页面进行的某些更改时出现此错误。我对此进行了一些研究,但是我能够找到的可能解决方案(例如迁移数据库)根本行不通。如果您想查看我的代码的某些特定部分,请告诉我。 以下是错误: and the traceback: 问题答案: 我自己碰到了这个问题,它似乎与https://code.djangoproject.com/t

  • 我试图编译JDK 12()在我自己的MacBook Pro 2019中使用英特尔芯片(macOS Monterey 12.3.1)。第一步我运行configure命令: 输出如下所示: 没有错误输出。使用以下命令生成项目时: 显示如下错误: 我也试过: 我该怎么解决这个问题?

  • 在Windows下,可执行程序(Executable Program)大部分是 .exe 程序,它是一系列计算机指令和数据的集合。这些指令都是二进制形式的,CPU可以直接识别,毫无障碍;但是对于程序员,它们非常晦涩,难以记忆和使用。 计算机发展初期,程序员就是使用这些二进制形式的CPU指令来编写程序的。 直接使用CPU指令编程对程序员来说简直是噩梦,尤其是当程序比较大的时候,不但编写麻烦,需要频繁