【问题标题】:Why is my SQLite still not working in my fragments after i add a column为什么我的 SQLite 在我添加一列后仍然无法在我的片段中工作
【发布时间】:2015-08-01 09:46:38
【问题描述】:

我是编码新手。我尝试使用 SQLite 添加新列,但它不显示 link 列输出,只显示 TextView 中的名称。
谁能告诉我我的代码有什么问题,因为它不会显示link 列?

历史片段

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.database.Cursor;


public class HistoryFragment extends Fragment {
EditText name;
EditText link;
TextView sqlDisplay;
MyDBHandler dbHandler;

public HistoryFragment() {


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_history, container, false);
    link = (EditText) rootView.findViewById(R.id.link);
    name = (EditText) rootView.findViewById(R.id.name);
    sqlDisplay = (TextView) rootView.findViewById(R.id.sqlDisplay);
    dbHandler = new MyDBHandler(this.getActivity(),null , null, null, 1);
    printDatabase();
    return rootView;




}

@Override
public void onViewCreated(View rootView, Bundle savedInstanceState) {
    rootView.findViewById(R.id.saveButton).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            saveOnClicked(v);
        }
    });
    rootView.findViewById(R.id.deleteButton).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteOnClicked(v);
        }
    });
}
//Add a product to the database

public void saveOnClicked(View view) {
    favourites favourites = new favourites(name.getText().toString(),link.getText().toString());

    dbHandler.addFavourites(favourites);
    printDatabase();
}

//Delete items
public void deleteOnClicked(View view) {
    String inputTextName = name.getText().toString();
    String inputTextLink = link.getText().toString();
    dbHandler.deleteFavourites(inputTextName,inputTextLink );
    printDatabase();
}

//Print the database
public void printDatabase() {
    String dbString = dbHandler.databaseToString();
    sqlDisplay.setText(dbString);
    name.setText("") ; link.setText("");
}
}

Favorites.java

public class favourites {
private int _id;
private String _videoname;
private String _link;

public favourites(){

}

public favourites (String videoname,String link){
    this._videoname = videoname;
    this._link = link;
}
public void set_id(int _id) {
    this._id = _id;
}
public void set_videoname(String _videoname) {
    this._videoname = _videoname;
}
public String get_videoname() {
    return _videoname;
}
public int get_id() {
    return _id;
}





public String get_link() {
    return _link;
}

public void set_link(String _link) {
    this._link = _link;
}
}

MyDBHandler

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHandler extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 3;
public static final String DATABASE_NAME = "favourites.db";
public static final String TABLE_FAVOURITES = "favourites";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_VIDEONAME = "videoname";
public static final String COLUMN_LINK = "link";

public MyDBHandler(Context context, String name, String link, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}



@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_FAVOURITES + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_VIDEONAME + " TEXT, " + COLUMN_LINK + " TEXT " +
            ");";
    db.execSQL(query);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVOURITES);
    onCreate(db);
}

public void addFavourites(favourites favourites) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_VIDEONAME, favourites.get_videoname());
    values.put(COLUMN_LINK, favourites.get_link());
    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_FAVOURITES, null,values);
    db.close();
}

public void deleteFavourites(String videoName, String link) {
    SQLiteDatabase db = getWritableDatabase();

    db.execSQL("DELETE FROM " + TABLE_FAVOURITES + " WHERE " + COLUMN_VIDEONAME + "=\"" + videoName + "\" "
                    + COLUMN_LINK + "=\"" + link + "\" ;"
    );
}

public String databaseToString() {
    String dbString = "";
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM " + TABLE_FAVOURITES + " WHERE 1";

    //Cursor points to a location in your results
    Cursor c = db.rawQuery(query, null);
    //Move to the first row in your results
    c.moveToFirst();

    //Position after the last row means the end of the results
    while (!c.isAfterLast()) {
        if (c.getString(c.getColumnIndex("videoname")) != null) {
            dbString += c.getString(c.getColumnIndex("videoname"));
            dbString += "\n";

        }
        c.moveToNext();
    }
    db.close();
    return dbString;
}

}

【问题讨论】:

    标签: android sqlite android-fragments


    【解决方案1】:

    您需要在列定义之间使用逗号。
    你实际上有这个:

    COLUMN_VIDEONAME + " TEXT " + COLUMN_LINK + " TEXT " +
    

    但你需要这个

    COLUMN_VIDEONAME + " TEXT, " + COLUMN_LINK + " TEXT " +
    

    然后,像往常一样,然后简单地增加 DATAVBASE_VERSION 常量的值。
    或者卸载并重新安装您的应用。

    【讨论】:

    • 谢谢,不过好像还是有问题,我会更新日志,还是谢谢你!修复其中一个问题
    • 然后只需将 DATAVBASE_VERSION 常量的值增加到 4。或者卸载并重新安装您的应用程序。
    • 我卸载了它,但它现在只显示名称字符串 tho:(,但我真的很感谢你的帮助!
    • 是的,因为您只获得videoname 列值:dbString += c.getString(c.getColumnIndex("videoname"));。顺便说一句,WHERE 1 真的不需要。如果不指定条件,则返回所有行。
    • 我知道这对你来说可能听起来很愚蠢,但我将代码更改为 dbString += c.getString(c.getColumnIndex("videoname"+"link")); , 不对, 应该放什么, :( 抱歉问了这么愚蠢的问题>
    【解决方案2】:

    你的 Sqlite 查询有问题

     **String query = "SELECT * FROM " + TABLE_FAVOURITES + " WHERE 1";**
    
    
    String query = "SELECT * FROM " + TABLE_FAVOURITES + " WHERE YOUR_COLUMN_NAME=1";
    

    【讨论】:

    • ohhh,但是 1 不是表示全部显示吗?在我添加一个列之前它可以工作>
    • 否,在数据库中WHERE用于过滤数据。 SELECT * FROM MY_TABLE 将显示表 MY_TABLE 的所有行,如果我们添加 WHERE 像 SELECT * FROM MY_TABLE WHERE ID=1 将只显示那些值为 1 的列 ID 的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    相关资源
    最近更新 更多