Android Studio问题与静态方法声明

时间:2017-10-27 00:59:30

标签: java static

我目前正在尝试创建一个项目,该项目将创建一个包含3个元素ID,NAME和STATUS的数据库。然后我需要将所有这些值存储到3个列表视图中,这些视图都在同一个活动上。这是我的sqlite代码:

package com.example.mikediloreto.sqliteproject;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;


public class myDB extends SQLiteOpenHelper{


private static final int DB_VERSION = 1;
private static final String TB_Student = "student";
public static final String ID = "id";
public static final String NAME = "name";
public static final String STATUS = "status";

public myDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
    super(context, name, factory, version, errorHandler);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("Create Table " + TB_Student + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + NAME + " TEXT NOT NULL, " + STATUS + " TEXT" + ");");

}

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

}

public Cursor getStudents() {
    String[] cols = new String[] { ID, NAME, STATUS};
    SQLiteDatabase db = getReadableDatabase();
    return db.query(TB_Student, cols, null, null, null, null, NAME);

}

public Cursor getStudent(int studentId) {
    String[] cols = new String[] { ID, NAME, STATUS};
    String sel = ID + "=?";
    String[] selArgs = new String[] { String.valueOf(studentId)};
    SQLiteDatabase db = getReadableDatabase();
    return db.query(TB_Student, cols, sel, selArgs, null, null, null);

}

public long numStudents() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteStatement st = db.compileStatement("SELECT COUNT(1) " + "FROM "+ TB_Student + ";");
    return st.simpleQueryForLong();

}

public long addStudent(String name, String status) {
    ContentValues cv = new ContentValues();
    cv.put(NAME, name);
    cv.put(STATUS, status);
    SQLiteDatabase db = getWritableDatabase();
    return db.insert(TB_Student, null, cv);

}

public boolean delStudent(int studentId) {
    String sel = ID + "=?";
    String[] selArgs = new String[] { String.valueOf(studentId) };
    SQLiteDatabase db = getReadableDatabase();
    return (db.delete(TB_Student, sel, selArgs) > 0);
}

}

这是我的主要活动:

package com.example.mikediloreto.sqliteproject;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.*;



public class MainActivity extends ListActivity {

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

    ListView lv1=(ListView)this.findViewById(R.id.leftListView);
    ListView lv2=(ListView)this.findViewById(R.id.centerListView);
    ListView lv3=(ListView)this.findViewById(R.id.rightListView);



    setListAdapter(new SimpleCursorAdapter(this, R.layout.*, myDB.getStudents(), new String [] { myDB.ID, myDB.NAME, myDB.STATUS }, new int[] { android.R.id.text1 }, 0));

    }
}

我遇到的问题是,当我调用myDB.getStudents()时,它告诉我需要将方法声明设为静态,但如果我将其设为静态,那么我会收到错误告诉我它可以' t是getReadableDatabase()的静态工作。不知道从哪里开始,如果还有其他任何明显错误,请告诉我。

当我使用R.layout。*时,控制台告诉我发生错误,修复是在getStudents()调用之后将其放入。

编辑:创建实例变量。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  

您的问题是,您无法使用类名来访问类中的非static public方法。

  • 因此,您可以使用myDB mMyDB;并使用Class object访问getStudents方法。

  • 您可以制作方法static

在您的myDB中。您可以更改为此内容。

public myDB(Context contextr) {
    super(context, NAME , null , DB_VERSION , mull);
}

并在MainActivity

public class MainActivity extends ListActivity {
myDB mMyDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView lv1=(ListView)this.findViewById(R.id.leftListView);
    ListView lv2=(ListView)this.findViewById(R.id.centerListView);
    ListView lv3=(ListView)this.findViewById(R.id.rightListView);


    mMyDB = new myDB(this);
    // edited here , change the layout
    setListAdapter(new SimpleCursorAdapter(this, R.layout.your_layout, mMyDB.getStudents(), new String [] { myDB.ID, myDB.NAME, myDB.STATUS }, new int[] { android.R.id.text1 }, 0));

}
}

修改

您应该将R.layout.your_layout更改为您拥有的布局。

注意

然后修改你的班级名称,这篇文章不是很标准化。

样本 MyDB

第一个字母的类名应为大写。