java - 向多个表添加数据行时实现 AsyncTask

标签 java android sqlite android-asynctask

我创建了一个显示 TextViewProgressBar 的屏幕。 ProgressBar 代表数据库创建并使用 GSON 将 1000++ 数据添加到 SQLite 中。为了实现这一目标,我创建了三个不同的文件,LocalDBHelper(这是我的数据库设置)、GSONHandler (将我的 JSON 文件转换为 SQLite)和加载(对于我的 AsyncTask)。

我的问题是,我的 ProgressBar 是静态的,它没有显示添加数据的进度。我是 Android 开发新手,对继续编写代码一无所知。

MainActivity.java

public class MainActivity extends AppCompatActivity implements Loading.LoadingTaskFinishedListener {

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

        LocalDBHelper mydb = LocalDBHelper.newInstance(this);
        //check if db exist, delete db if exist
            if (doesDatabaseExist(mydb.getDatabaseName()))
                this.deleteDatabase(mydb.getDatabaseName());

        ProgressBar progressBar = findViewById(R.id.progressBar);
            new Loading(progressBar, this, this).execute("");

        }

      @Override
      public void onTaskFinished() {
        finish();
      }

        public boolean doesDatabaseExist(String databaseName) {
            File dbFile = this.getDatabasePath(databaseName);
            return dbFile.exists();
        }
}

正在加载.java

public class Loading extends AsyncTask<String, Integer, Integer> {

    public interface LoadingTaskFinishedListener {
        void onTaskFinished();
    }

    private LocalDBHelper mydb = null;

    private final ProgressBar progressBar;
    private Context mContext;
    private final LoadingTaskFinishedListener finishedListener;

    public Loading(ProgressBar progressBar, LoadingTaskFinishedListener finishedListener, Context context) {
        this.progressBar = progressBar;
        this.finishedListener = finishedListener;
        this.mydb = LocalDBHelper.newInstance(context);
        mContext = context;

    }

    @Override
    protected Integer doInBackground(String... params) {
        SQLiteDatabase sqLiteDatabase = mydb.getWritableDatabase();
        GSONHandler.newInstance(mContext, sqLiteDatabase);

        return 1234;

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        finishedListener.onTaskFinished();
    }
}

GSONHandler.java

public class GSONHandler {

    static final String TAG = GSONHandler.class.getSimpleName();

    private Context context;
    private LocalDBHelper mydb;
    private SQLiteDatabase sqLiteDatabase;

    private static GSONHandler mGsonHandler = null;

    public static GSONHandler newInstance(Context context, SQLiteDatabase sqLiteDatabase){
        if (mGsonHandler == null){
            mGsonHandler = new GSONHandler(context.getApplicationContext(), sqLiteDatabase);
        }
        return mGsonHandler;
    }

    private GSONHandler(Context context, SQLiteDatabase sqLiteDatabase) {
        this.context = context;
        this.sqLiteDatabase = sqLiteDatabase;

        onCreate();
    }

    //assign json data to tables
    private void onCreate() {

        //get local json and save it to db
        premiseCategoryMasterSetup();
        premiseCategorySetup();
        inspcTypeSetup();
        inspcStatusSetup();
        stateSetup();
        areaSetup();
        districtSetup();
        analysisGroupSetup();
        analysisSubGroup();
        parameterSetup();
        subParameterSetup();
        identificationSetup();
        premiseCertliSetup();
        txn_premiseSetup();
        prosecutionOtherSetup();
        txn_layoutSectionSetup();
        txn_layoutCardSetup();
        txn_layoutInputFieldSetup();
    }

    private void areaSetup() {
        Log.d(TAG, "areaSetup");
        InputStream inputStream = context.getResources().openRawResource(R.raw.ref_area);
        String jsonString = readJsonFile(inputStream);

        Gson gson = new Gson();
        List<Area> areaList = Arrays.asList(gson.fromJson(jsonString, Area[].class));

        for (Area area : areaList)
        {
            if(sqLiteDatabase != null) {
                ContentValues values = new ContentValues();
                values.put(Constants.COLUMN_AREA_ID, area.getAreaId());
                values.put(Constants.COLUMN_AREA_CODE, area.getAreaCode());
                values.put(Constants.COLUMN_AREA_NAME, area.getAreaName());
                values.put(Constants.COLUMN_ACTIVE, area.getActive());
                values.put(Constants.COLUMN_FK_STATE_ID, area.getFk_stateId());

                long id = sqLiteDatabase.insertOrThrow(Constants.REF_AREA_TABLE,
                        null, values);
            }
        }

    }

    ....

    private String readJsonFile(InputStream inputStream) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte bufferByte[] = new byte[1024];
        int length;

        try {
            while ((length = inputStream.read(bufferByte)) != -1) {
                outputStream.write(bufferByte, 0 , length);
            }
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return outputStream.toString();
    }

}

最佳答案

您正在 onProgressUpdate 方法中设置进度条的进度,但从未调用它。要调用onProgressUpdate方法,您需要在doInBackground方法中调用publishProgress方法。调用 publishProgress 方法后,将在 UI 线程上调用 onProgressUpdate 方法。

关于java - 向多个表添加数据行时实现 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829061/

相关文章:

android - 底部按钮栏与 Listview 的最后一个元素重叠!

iphone - 当 iPhone 中的 Appstore 上的应用程序版本更改时,sqlite 数据库更新

SQLite3 整数最大值

java - 如何在 hibernate 中使用联合执行查询?

java - 如何使用同一个触发器在 quartz 调度程序中安排多个作业?

java - 500 内部服务器错误,获取请求时出现 NullPointerException

android - android ndk r14 的 SDL2 示例构建错误

android - 仅当应用程序 100% 完成时,才在仪器测试后正确清理/拆卸

sqlite - Mono.Data.Sqlite.SqliteConnection 需要一个没有意义的 'System' 版本

java - 如何在 TextView 中显示一些文本指定的时间?