如何基于sqlite中存储的某些单个值更改MPandroidCharts中的条形颜色?

时间:2018-07-31 16:44:43

标签: android android-sqlite bar-chart mpandroidchart

如果有一个SQLite可以存储3个值名称,贷方和标记。我有一个带有x轴:名称,y轴:bunks的mpandroid条形图。我想更改单个条形颜色或基于存储在SQLite中的每个条目的信用来添加限制线。这可能吗? 我是新手,请帮帮我。

public class Myhelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME="mydatabase.db";
    public static final String TABLE_NAME="mytable";
    public static final String COLUMN_ID="_id";
    public static final String COL_1="NAME";
    public static  final String COL_2="CREDIT";
    public  static final String COL_3="BUNKS";
    public static final String[] COLUMNS ={COLUMN_ID,COL_1,COL_2,COL_3};
    Context con;

    public Myhelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        con = context;
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable= "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID +" INTEGER PRIMARY KEY AUTOINCREMENT, " + " NAME TEXT, CREDIT TEXT, BUNKS INTEGER )";
        db.execSQL(createTable);
        Toast.makeText(con,"table created",Toast.LENGTH_SHORT).show();
    }

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

    }
    public boolean insertData(String x,String y,int z){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_1, String.valueOf(x));
        contentValues.put(COL_2,String.valueOf(y));
       contentValues.put(COL_3,z);
        long result = db.insert(TABLE_NAME, null, contentValues);
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    public ArrayList<String> queryXdata(){
        ArrayList<String> xnewdata= new ArrayList<String>();
        String query = "SELECT "+ COL_1 + " FROM " + TABLE_NAME;
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cursor= db.rawQuery(query,null);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
            xnewdata.add(cursor.getString(cursor.getColumnIndex(COL_1)));
        }
        cursor.close();
        return xnewdata;

    }
    public ArrayList<Integer> queryYdata(){
        ArrayList<Integer> ynewdata= new ArrayList<Integer>();
        String query = "SELECT "+ COL_3+ " FROM " + TABLE_NAME;
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cursor= db.rawQuery(query,null);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
            ynewdata.add(cursor.getInt(cursor.getColumnIndex(COL_3)));
        }
        cursor.close();
        return ynewdata;

    }
    public  ArrayList<Integer> queryZdata(){
       ArrayList<Integer> znewdata= new ArrayList<Integer>();
        String query = "SELECT "+ COL_2+ " FROM " + TABLE_NAME;
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cursor= db.rawQuery(query,null);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
            znewdata.add(((cursor.getColumnIndex(COL_2))));
        }
        cursor.close();
        return znewdata;
    }

    public attendence getdetails(long id){
        SQLiteDatabase db = this.getWritableDatabase();
        String query= "SELECT" + COL_2+" FROM " + TABLE_NAME +" WHERE _id=" + id;
        Cursor cursor= db.rawQuery(query,null);
        attendence attendence1= new attendence();
        if (cursor.getCount()>0){
            cursor.moveToFirst();
            attendence1.setSubname(cursor.getString(cursor.getColumnIndex(COL_1)));
            attendence1.setCredit(cursor.getString(cursor.getColumnIndex(COL_2)));
            attendence1.setBunks(cursor.getInt(cursor.getColumnIndex(COL_3)));
        }
        return attendence1;
    }

    public void delete(long id,Context context){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("DELETE FROM "+TABLE_NAME+" WHERE _id='"+id+"'");
        Toast.makeText(context,"delted",Toast.LENGTH_SHORT).show();
    }
    public List<attendence> list(String  filter){
        String query;
        if (filter.equals("")){
            query = "SELECT * FROM " + TABLE_NAME ;

        }
        else {
            query= " SELECT * FROM " + TABLE_NAME ;

        }
        List<attendence> linkedlist = new LinkedList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query,null);
        attendence attendence;
        if (cursor.moveToFirst()){
            do {
                attendence = new attendence();
                attendence.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_ID)));
                attendence.setSubname(cursor.getString(cursor.getColumnIndex(COL_1)));
                attendence.setCredit(cursor.getString(cursor.getColumnIndex(COL_2)));
                attendence.setBunks(cursor.getInt(cursor.getColumnIndex(COL_3)));
                linkedlist.add(attendence);
            }
            while (cursor.moveToNext());
        }
        return linkedlist;
    }


    public int getbunk(long id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + " = " + String.valueOf(id), null);
        int output = -1;
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                output = cursor.getInt(cursor.getColumnIndex(COL_3));
            }
            cursor.close();
        }
        return output;

    }
    public int updatebunk(long id){
        SQLiteDatabase db = this.getWritableDatabase();
        int bunk = getbunk(id);
        if (bunk<0){
            Log.i("error", "updatebunk:below 0 ");

        }
        int bunkinc= ++bunk;
        ContentValues contentValues= new ContentValues();
        contentValues.put(COL_3, bunkinc);
        db.update(TABLE_NAME,contentValues,COLUMN_ID+ "=?",new String[]{String.valueOf(id)});
        db.close();

        return bunkinc;
    }
    public int updatebunkdelete(long id){
        SQLiteDatabase db = this.getWritableDatabase();
        int bunk = getbunk(id);
        int bunkdec= --bunk;
        ContentValues contentValues= new ContentValues();
        contentValues.put(COL_3,bunkdec);
        db.update(TABLE_NAME,contentValues,COLUMN_ID+ "=?",new String[]{String.valueOf(id)});
        db.close();
        return bunkdec;
    }
}

我的活动(条形图)

public  void addData(){
        ArrayList<BarEntry> yVals = new ArrayList<>();
        for (int i=0; i<myhelper.queryYdata().size(); i++){
            yVals.add(new BarEntry((((myhelper.queryYdata().get(i)))),i));
        }
        ArrayList<String> xvals= new ArrayList<>();
    for (int i=0;i<myhelper.queryXdata().size();i++){
        xvals.add(myhelper.queryXdata().get(i));
    }


    MyBarDataset dataSet= new MyBarDataset(yVals,"");
    dataSet.setColors(new int[]{ContextCompat.getColor(mcontext,R.color.green),
    ContextCompat.getColor(mcontext,R.color.yellow),
    ContextCompat.getColor(mcontext,R.color.red)});
    BarData data = new BarData(xvals,dataSet);
    mychart.setData(data);
    //bar custamization
    mychart.animateY(1000);
    mychart.setDrawGridBackground(false);
    mychart.setBackgroundColor(Color.WHITE);
    mychart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
    mychart.getAxisRight().setEnabled(false);
    mychart.setDescription("");
    mychart.getLegend().setEnabled(false);
    mychart.getXAxis().setDrawGridLines(false);
    mychart.getAxisLeft().setDrawGridLines(false);
    mychart.getAxisLeft().setStartAtZero(true);
    mychart.getAxisLeft().setAxisMinValue(0);


}
public class MyBarDataset extends BarDataSet{

    public MyBarDataset(List<BarEntry> yVals, String label) {
        super(yVals, label);
    }

    @Override
    public int getColor(int index){


        if (getEntryForXIndex(index).getVal()<8){
            return mColors.get(0);
        }
        else if (getEntryForXIndex(index).getVal()<13)
            return mColors.get(1);
        else
            return mColors.get(2);

    }
}

1 个答案:

答案 0 :(得分:1)

据我了解,您想基于bunk绘制条形,但要基于credits绘制条形。使用自定义条形数据集是正确的方法,只需稍作修改即可。下面的代码获取您正在描述的内容。

我所做的更改:

  • 无法将名称列表传递给BarData,请改用轴值格式化程序
  • 更改了自定义栏数据集,使其也包含credits数组。不知道您的getEntryForXIndex方法是否在其他地方定义,但是不在您发布的代码中。
  • 已删除不推荐使用的调用和无效的语法(无法调用setDescription("");

如果这不是您要查找的内容,请使用有关您所看到的内容的更多详细信息来更新问题,等等。据我所知,问题与图表有关,与SQL数据库无关。

Screenshot of example chart

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

    BarChart chart = findViewById(R.id.test_chart);

    // Some made up data - replace these with your
    //  queryYdata, queryXdata, and queryZdata methods
    String[] names = new String[]{"foo","bar","fiz","bam","boo"};
    List<Float> credits = new ArrayList<>(Arrays.asList(1f,9f,2.5f,15f,50f));
    float[] bunks = new float[]{10f,15f,16f,20f,5f};

    List<BarEntry> entries = new ArrayList<>();
    for(int i = 0; i < bunks.length; ++i) {
        entries.add(new BarEntry(i, bunks[i]));
    }

    float textSize = 16f;

    MyBarDataset dataSet = new MyBarDataset(entries, "data", credits);
    dataSet.setColors(ContextCompat.getColor(this,R.color.green),
            ContextCompat.getColor(this,R.color.yellow),
            ContextCompat.getColor(this,R.color.red));
    BarData data = new BarData(dataSet);
    data.setDrawValues(false);
    data.setBarWidth(0.9f);

    chart.setData(data);
    chart.setFitBars(true);
    chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(names));
    chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
    chart.getXAxis().setTextSize(textSize);
    chart.getAxisLeft().setTextSize(textSize);
    chart.setExtraBottomOffset(10f);

    chart.getAxisRight().setEnabled(false);
    Description desc = new Description();
    desc.setText("");
    chart.setDescription(desc);
    chart.getLegend().setEnabled(false);
    chart.getXAxis().setDrawGridLines(false);
    chart.getAxisLeft().setDrawGridLines(false);

    chart.invalidate();
}

public class MyBarDataset extends BarDataSet{

    private List<Float> credits;

    MyBarDataset(List<BarEntry> yVals, String label, List<Float> credits) {
        super(yVals, label);
        this.credits = credits;
    }

    @Override
    public int getColor(int index){
        float c = credits.get(index);

        if (c < 8){
            return mColors.get(0);
        }
        else if (c < 13) {
            return mColors.get(1);
        }
        else {
            return mColors.get(2);
        }
    }
}

编辑:关于SQL数据库的一句话-不要在循环内调用queryXDataqueryYData!这将在每次循环迭代时提取整个数据数组,然后再次在循环本身内部(非常昂贵)。只需使用类似这样的内容即可:

ArrayList<BarEntry> yVals = new ArrayList<>();
ArrayList<Integer> yData = myhelper.queryYdata();
for (int i=0; i<yData.size(); i++){
    yVals.add(new BarEntry(i,yData.get(i)));
}

ArrayList<String> xData = myhelper.queryXdata();