【问题标题】:AVG(COLUMN_SCORE) Not Getting Written To SQLite DatabaseAVG(COLUMN_SCORE) 未写入 SQLite 数据库
【发布时间】:2019-01-03 15:28:11
【问题描述】:

我创建了以下方法来生成系列的平均分数:

//Getting Series Averages From Game.COLUMN_SCORE
public String getSeriesAverage(String leagueId, String bowlerId)
{
    String total = "";
    Series series = new Series();
    ContentValues values = new ContentValues();
    SQLiteDatabase database = getWritableDatabase();
    Cursor cursor = database.rawQuery("SELECT AVG(" + Game.COLUMN_SCORE + ") FROM " + Game.TABLE_NAME + " WHERE " + Game.COLUMN_LEAGUE_ID + " = '" + leagueId + "'" + " AND " + Game.COLUMN_BOWLER_ID + " = '" + bowlerId + "'" + " GROUP BY " + Game.COLUMN_SERIES_ID /*+ " = '" + seriesId + "'"*/, null);
    if (cursor.moveToFirst()) {
        do {
            total = cursor.getString(0);
            values.put(Series.COLUMN_SERIES_AVERAGE, total);
            database.update(Series.TABLE_NAME, values, Series.COLUMN_ID + "=" + series.getId(), null);

            Log.d("SERIES_AVERAGE - SQL","COLUMN_SERIES_AVERAGE = >>>>" + Series.COLUMN_SERIES_AVERAGE + "<<<<");
            Log.d("TOTAL - CURSOR VALUE","Total = >>>>" + total + "<<<<");
        } while (cursor.moveToNext());
        values.put(Series.COLUMN_SERIES_AVERAGE, total);

        database.update(Series.TABLE_NAME, values, Series.COLUMN_ID + "=" + series.getId(), null);
    }
    cursor.close();
    //Close Database Connection
    database.close();
    //Log.d("GET AVERAGE FROM SQL","Average = >>>>" + total + "<<<<");
    return total;
}

它似乎有效,我可以在 Logcat 中看到为单个投球手列出的每个系列的平均值:

07-26 14:50:15.158 25330-25330/ca.rvogl.tpbcui D/GETALLSERIES-SQL: SQL used = >>>>SELECT  * FROM Series WHERE league_id = '1' AND bowler_id = '1' ORDER BY timestamp DESC<<<<
07-26 14:50:15.167 25330-25330/ca.rvogl.tpbcui D/GETALLSERIESS-CNT: Number of rows retrieved = 3
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>207<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>111<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>300<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>1<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF SERIES: Average = >>>>1<<<<
07-26 14:50:15.177 25330-25330/ca.rvogl.tpbcui D/GETALLSERIES-CNT: Number of elements in serieslist = 3

但是,您也可以从 logcat 中看到该值没有被写入数据库,如下所示:

07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/AVERAGE OF FIRST SERIES: Average = >>>>300<<<<
07-26 14:50:15.175 25330-25330/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>average<<<<

它实际上只是显示来自Series Class的变量的名称。

谁能帮我把这些值写入数据库。我不确定我做错了什么,任何帮助将不胜感激。如果您需要查看任何其他代码,请告诉我,我会发布它。

系列表的结构:

// Create table SQL query
    public static final String CREATE_TABLE =
            "CREATE TABLE " + TABLE_NAME + "("
                    + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + COLUMN_LEAGUE_ID + " TEXT,"
                    + COLUMN_BOWLER_ID + " TEXT,"
                    + COLUMN_NAME + " TEXT,"
                    + COLUMN_SERIES_AVERAGE + " TEXT,"
                    + COLUMN_TIMESTAMP + " DATETIME DEFAULT CURRENT_TIMESTAMP"
                    + ")";

    public Series() {
    }

    public Series(int id, String league_id, String bowler_id, String name, String average, String timestamp) {
        this.id = id;
        this.league_id = league_id;
        this.bowler_id = bowler_id;
        this.name = name;
        this.average = average;
        this.timestamp = timestamp;
    }

Logcat:

07-26 19:00:42.250 32441-32441/ca.rvogl.tpbcui D/GETALLSERIES-SQL: SQL used = >>>>SELECT  * FROM Series WHERE league_id = '1' AND bowler_id = '1' ORDER BY timestamp DESC<<<<
07-26 19:00:42.263 32441-32441/ca.rvogl.tpbcui D/GETALLSERIESS-CNT: Number of rows retrieved = 2
07-26 19:00:42.279 32441-32441/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>null<<<<
07-26 19:00:42.279 32441-32441/ca.rvogl.tpbcui D/TOTAL - CURSOR VALUE: Total = >>>>111<<<<
07-26 19:00:42.281 32441-32441/ca.rvogl.tpbcui D/SERIES_AVERAGE - SQL: COLUMN_SERIES_AVERAGE = >>>>null<<<<
07-26 19:00:42.281 32441-32441/ca.rvogl.tpbcui D/TOTAL - CURSOR VALUE: Total = >>>>300<<<<
07-26 19:00:42.286 32441-32441/ca.rvogl.tpbcui D/GETALLSERIES-CNT: Number of elements in serieslist = 2

系列活动

public class SeriesActivity extends AppCompatActivity {

    private SeriesAdapter mAdapter;
    private final List<Series> seriesList = new ArrayList<>();
    private TextView noSeriesView;

    private DatabaseHelper db;

    private TextView leagueId;
    private String savedLeagueId;
    private TextView bowlerId;
    private String savedBowlerId;
    private TextView seriesAverage;
    private String savedSeriesAverage;

    private static final String PREFS_NAME = "prefs";
    private static final String PREF_BLUE_THEME = "blue_theme";
    private static final String PREF_GREEN_THEME = "green_theme";
    private static final String PREF_ORANGE_THEME = "purple_theme";
    private static final String PREF_RED_THEME = "red_theme";
    private static final String PREF_YELLOW_THEME = "yellow_theme";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        //Use Chosen Theme
        SharedPreferences preferences = getSharedPreferences( PREFS_NAME, MODE_PRIVATE );
        boolean useBlueTheme = preferences.getBoolean( PREF_BLUE_THEME, false );
        if (useBlueTheme) {
            setTheme( R.style.AppTheme_Blue_NoActionBar );
        }
        boolean useGreenTheme = preferences.getBoolean( PREF_GREEN_THEME, false );
        if (useGreenTheme) {
            setTheme( R.style.AppTheme_Green_NoActionBar );
        }
        boolean useOrangeTheme = preferences.getBoolean( PREF_ORANGE_THEME, false );
        if (useOrangeTheme) {
            setTheme( R.style.AppTheme_Orange_NoActionBar );
        }
        boolean useRedTheme = preferences.getBoolean( PREF_RED_THEME, false );
        if (useRedTheme) {
            setTheme( R.style.AppTheme_Red_NoActionBar );
        }
        boolean useYellowTheme = preferences.getBoolean( PREF_YELLOW_THEME, false );
        if (useYellowTheme) {
            setTheme(R.style.AppTheme_Yellow_NoActionBar);
        }



        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_series);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar( toolbar );
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String seriesLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
                String seriesBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
                Intent intent=new Intent();
                intent.putExtra("seriesLeagueId",seriesLeagueId);
                intent.putExtra("seriesBowlerId",seriesBowlerId);
                setResult(1,intent);
                finish();//finishing activity
                overridePendingTransition(0, 0);
            }
            /*@Override
            public void onClick(View v) {
                startActivity(new Intent(SeriesActivity.this, BowlerActivity.class));
                finish();
            }*/
        });

        savedLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
        leagueId = (TextView) findViewById( R.id.tvLeagueId );
        savedBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
        bowlerId = (TextView) findViewById( R.id.tvBowlerId );
        seriesAverage = (TextView) findViewById(R.id.tvSeriesAverage);

        CoordinatorLayout coordinatorLayout = findViewById( R.id.coordinator_layout );
        RecyclerView recyclerView = findViewById( R.id.recycler_view );
        noSeriesView = findViewById( R.id.empty_series_view );

        db = new DatabaseHelper( this );


        seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId) );

        FloatingActionButton fab = (FloatingActionButton) findViewById( R.id.add_series_fab );
        fab.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showSeriesDialog( false, null, -1 );
            }
        } );

        mAdapter = new SeriesAdapter( this, seriesList );
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager( getApplicationContext() );
        recyclerView.setLayoutManager( mLayoutManager );
        recyclerView.setItemAnimator( new DefaultItemAnimator() );
        recyclerView.addItemDecoration( new MyDividerItemDecoration( this, LinearLayoutManager.VERTICAL, 16 ) );
        recyclerView.setAdapter( mAdapter );

        toggleEmptySeries();

        //On Long Click On The RecyclerView Item An Alert Dialog Is Opened With The Option To Choose Edit/Delete
        recyclerView.addOnItemTouchListener( new RecyclerTouchListener( this, recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, final int position) {

                int seriesId = seriesList.get( position ).getId();
                String seriesLeagueId = seriesList.get( position ).getLeagueId();
                String seriesBowlerId = seriesList.get( position ).getBowlerId();
                Intent myIntent = new Intent( SeriesActivity.this, GameActivity.class );
                myIntent.putExtra( "gameLeagueId", seriesLeagueId );
                myIntent.putExtra( "gameBowlerId", seriesBowlerId );
                myIntent.putExtra( "gameSeriesId", seriesId );
                startActivityForResult(myIntent, 1);
                overridePendingTransition(0, 0);
            }

            @Override
            public void onLongClick(View view, int position) {
                showActionsDialog( position );
            }
        } ) );
    }


    //Inserting New Series In The Database And Refreshing The List
    private void createSeries(String leagueId, String bowlerId, String series) {
        //Inserting Series In The Database And Getting Newly Inserted Series Id
        long id = db.insertSeries( leagueId, bowlerId, series );

        //Get The Newly Inserted Series From The Database
        Series n = db.getSeries( leagueId, bowlerId );

        if (n != null) {
            //Adding New Series To The Array List At Position 0
            seriesList.add( 0, n );
            //Refreshing The List

            mAdapter.notifyDatasetChanged( db.getAllSeries( savedLeagueId, savedBowlerId ) );

            toggleEmptySeries();
        }
    }

    //Updating Series In The Database And Updating The Item In The List By Its Position
    private void updateSeries(String name, int position) {
        Series n = seriesList.get( position );

        //Updating Series Text
        n.setLeagueId( savedLeagueId );
        n.setBowlerId( savedBowlerId );
        n.setName( name );


        //Updating The Series In The Database
        db.updateSeries( n );

        //Refreshing The List
        seriesList.set( position, n );
        //mAdapter.notifyItemChanged(position);
        mAdapter.notifyDatasetChanged( db.getAllSeries( savedLeagueId, savedBowlerId ) );


        toggleEmptySeries();
    }

    //Deleting Series From SQLite Database And Removing The Bowler Item From The List By Its Position
    private void deleteSeries(int position) {
        //Deleting The Series From The Database
        db.deleteSeries( seriesList.get( position ) );

        //Removing The Bowler From The List
        seriesList.remove( position );
        mAdapter.notifyItemRemoved( position );

        toggleEmptySeries();
    }

    //Opens Dialog With Edit/Delete Options
    //Edit - 0
    //Delete - 0
    private void showActionsDialog(final int position) {
        CharSequence colors[] = new CharSequence[]{"Edit", "Delete"};

        AlertDialog.Builder builder = new AlertDialog.Builder( this );
        builder.setTitle( "Choose option" );
        builder.setItems( colors, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    showSeriesDialog( true, seriesList.get( position ), position );
                } else {
                    deleteSeries( position );
                }
            }
        } );
        builder.show();
    }

    //Show Alert Dialog With EditText Options to Enter/Edit A Series
    //When shouldUpdate = true, It Will Automatically Display Old Series Name And Change The Button Text To UPDATE
    private void showSeriesDialog(final boolean shouldUpdate, final Series series, final int position) {
        LayoutInflater layoutInflaterAndroid = LayoutInflater.from( getApplicationContext() );
        final View view = View.inflate( this, R.layout.dialog_series, null );

        AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder( SeriesActivity.this );
        alertDialogBuilderUserInput.setView( view );

        final EditText inputSeries = view.findViewById( R.id.etSeriesNameInput );
        leagueId.setText( savedLeagueId );
        bowlerId.setText( savedBowlerId );
        TextView dialogTitle = view.findViewById( R.id.dialog_title );
        dialogTitle.setText( !shouldUpdate ? getString( R.string.lbl_new_series_title ) : getString( R.string.lbl_edit_series_title ) );

        if (shouldUpdate && series != null) {
            inputSeries.setText( series.getName() );
            leagueId.setText( series.getLeagueId() );
            bowlerId.setText( series.getBowlerId() );

        }
        alertDialogBuilderUserInput.setCancelable( false ).setPositiveButton( shouldUpdate ? "update" : "save", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogBox, int id) {

            }
        } ).setNegativeButton( "cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogBox, int id) {
                dialogBox.cancel();
            }
        } ) .setNeutralButton("use date",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialogBox, int id) {
                        String dateNow = getDateNow();
                        inputSeries.setText(dateNow);

                    }
                });

        final AlertDialog alertDialog = alertDialogBuilderUserInput.create();
        alertDialog.show();

        alertDialog.getButton( AlertDialog.BUTTON_NEUTRAL ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Show Toast Message When No Text Is Entered
                if (inputSeries.getText().toString() !=null || !inputSeries.getText().toString().isEmpty() ) {
                    String dateNow = getDateNow();
                    inputSeries.setText(dateNow);
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );


        alertDialog.getButton( AlertDialog.BUTTON_POSITIVE ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 //Show Toast Message When No Text Is Entered
                if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
                    Toast.makeText( SeriesActivity.this, "Enter Series!", Toast.LENGTH_SHORT ).show();
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );
    }

    //Toggling List And Empty Series View
    private void toggleEmptySeries() {
        //You Can Check seriesList.size() > 0

        if (db.getSeriesCount() > 0) {
            noSeriesView.setVisibility( View.GONE );
        } else {
            noSeriesView.setVisibility( View.VISIBLE );
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate( R.menu.menu_main, menu );
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Intent intent = new Intent(this, SettingsActivity.class);
            startActivity(intent);
            overridePendingTransition(0, 0);
            return true;
        }

        return super.onOptionsItemSelected( item );
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        //Check If Request Code Is The Same As What Is Passed - Here It Is 1
        if(requestCode==1)
        {
            String savedLeagueId=data.getStringExtra("seriesLeagueId");
            String savedBowlerId=data.getStringExtra("seriesBowlerId");
            seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId ) );
        }
    }

    private String getDateNow() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("EEE. MMM. dd, yyyy", Locale.ENGLISH);
        return sdf.format(cal.getTime());
    }
    @Override protected void onResume() {
        super.onResume(); //seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId) );
    }
}

【问题讨论】:

    标签: javascript android sqlite android-studio


    【解决方案1】:

    为了将值写入数据库,您必须调用:

    values.put(Series.COLUMN_SERIES_AVERAGE, total); 
    update(table_name, values, "column_name=column_value", null)   
    

    table_name 是您插入values 的表的名称

    【讨论】:

    • 不行,把table_name换成""里面的表名,比如"mytable",按照上面写的方式调用
    • 如果你想创建新行的 id 我编辑了答案
    • 你为什么用 series.getAverage() 而不是 total?
    • 你没有调用 onResume 方法。它必须被覆盖(上面有 Override 注释):@Override public void onResume(){ super.onResume(); // put your code here... }
    • 现在我看到了你做了什么。如果你想这样,你必须先清除列表,然后添加所有项目
    猜你喜欢
    • 2018-12-31
    • 2018-05-16
    • 2020-08-03
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多