【问题标题】:I just wanna update my activity automatically when i insert or delete data in SQLite using FAB button and Delete button当我使用 FAB 按钮和删除按钮在 SQLite 中插入或删除数据时,我只想自动更新我的活动
【发布时间】:2021-01-10 11:16:09
【问题描述】:

当我删除任何数据时,它只是填补了该数据的空白,所以请帮助我在我的代码中应该做什么 https://drive.google.com/file/d/1rkM5D1WE2N-Qmqm2_DwiyLdnXDNhSSyV/view?usp=sharing 这是一张图片,你可以看到 12 14,我删除了 13,所以为什么它没有改变,如果我使用 Intent 刷新 MainActivity,所以数据被插入并且删除被改变,但是当我们按下后退按钮时它会移动到之前的 mainActivity 并且数据丢失了。

这是MainActivity代码

 package com.example.booklibrary;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputLayout;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    FloatingActionButton fltButn;
    AlertDialog alertDialog;
    SQLiteDatabase mDatabsae;
    myDatabaseClass myDatabaseClass;
    ArrayList < String > book__id, book__title, book__author, book__pages;
    customAdapter customAdapter;
    RelativeLayout forsnackbar;
    ImageView empty_image , main_Search ,showoff_Search;
    TextInputLayout search_text;
    TextView empty_textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        forsnackbar = findViewById ( R.id.main_relative );


        //for emptyIamge View
        empty_image  = findViewById ( R.id.empty_imageView );
        empty_textView =findViewById ( R.id.empty_textView );

        //for search
        main_Search = findViewById ( R.id.main_search );
        search_text =  findViewById ( R.id.search_editText );

        //for showoffSearch
        showoff_Search = findViewById ( R.id.showoff_search );
        showoff_Search.setOnClickListener ( new View.OnClickListener () {
            @Override
            public void onClick(View v) {
                showoff_Search.setVisibility ( View.GONE );
                main_Search.setVisibility ( View.VISIBLE );
                search_text.setVisibility ( View.VISIBLE );
            }
        } );

        //recyclerView
        recyclerView = findViewById ( R.id.recyclerView );
        recyclerView.setLayoutManager ( new LinearLayoutManager ( MainActivity.this ) );


        myDatabaseClass = new myDatabaseClass ( MainActivity.this );
        book__id = new ArrayList <> ();
        book__title = new ArrayList <> ();
        book__author = new ArrayList <> ();
        book__pages = new ArrayList <> ();

        //method for showing data into UI
        showDataToUi ();
        customAdapter = new customAdapter ( this , book__id , book__title , book__author , book__pages );
        recyclerView.setAdapter ( customAdapter );
        //floatingAction button
        fltButn = findViewById ( R.id.addFloating );
        fltButn.setOnClickListener ( new View.OnClickListener () {
            @Override
            public void onClick(View view) {
                // Toast.makeText ( MainActivity.this , "Hello" , Toast.LENGTH_SHORT ).show ();
                fabButtonClick ();
            }
        } );


    }


    private void fabButtonClick() {
        MaterialAlertDialogBuilder myDialog = new MaterialAlertDialogBuilder ( this );
        LayoutInflater layoutInflater = LayoutInflater.from ( this );
        View view = layoutInflater.inflate ( R.layout.add_data , null );
        myDialog.setView ( view );
        alertDialog = myDialog.create ();
        alertDialog.setCancelable ( true );


        final TextInputLayout title,author, pages;;
        Button addButton;
        title = view.findViewById ( R.id.Title );
        author = view.findViewById ( R.id.Auther );
        pages = view.findViewById ( R.id.pages );


        addButton = view.findViewById ( R.id.addButton );
        addButton.setOnClickListener ( new View.OnClickListener () {
            @Override
            public void onClick(View v) {

                String bookTitle = title.getEditText ().getText ().toString ().trim ();
                String bookAuthor = author.getEditText ().getText ().toString ().trim ();
                String bookPages =  pages.getEditText ().getText ().toString ().trim () ;

                if(bookTitle.equals ( "" ))
                {
                    title.setError ( "Required Field" );
                }
                else if(bookAuthor.equals ( "" ))
                {
                    author.setError ( "Required Field" );
                }
                else if(bookPages.equals ( "") )
                {
                    pages.setError (  "Required Field");
                }
                else {
                myDatabaseClass myDatabaseClass = new myDatabaseClass ( MainActivity.this );
                myDatabaseClass.addBook ( bookTitle , bookAuthor , bookPages );
                alertDialog.dismiss ();
//                Intent intent = new Intent ( getApplicationContext () , MainActivity.class );
//                startActivity ( intent );
                    Snackbar.make ( forsnackbar,"Added",Snackbar.LENGTH_SHORT ).show ();

            }
        } });
        alertDialog.show ();
        //.getWindow().setLayout(1200, 900); - this work when we use a simple AlerrtDialog

    }

    private void showDataToUi() {
        Cursor cursor = myDatabaseClass.readAllData ();
        if (cursor.getCount () == 0) {
            Toast.makeText ( this , "No data" , Toast.LENGTH_SHORT ).show ();
            empty_textView.setVisibility ( View.VISIBLE );
            empty_image.setVisibility ( View.VISIBLE );
        } else {
            while ((cursor.moveToNext ())) {
                book__id.add ( cursor.getString ( 0 ) ); //here add() function is from ArrayList
                book__title.add ( cursor.getString ( 1 ) );
                book__author.add ( cursor.getString ( 2 ) );
                book__pages.add ( cursor.getString ( 3 ) );
            }
            empty_textView.setVisibility ( View.GONE );
            empty_image.setVisibility ( View.GONE );
        }
    }



}

这是 myDatabse

package com.example.booklibrary;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

import androidx.annotation.Nullable;


public class myDatabaseClass extends SQLiteOpenHelper {
    private Context context;
    public static final String DATABASE_NAME = "BookLibrary.DB";
    public static final int DATABASE_VERSION = 1;

    public static final String TABLE_NAME = "My_Book";
    public static String COLUMN_ID = "_id";
    public static final String COLUMN_TITLE = "book_title";
    public static final String COLUMN_AUTHOR = "book_author";
    public static final String COLUMN_PAGES = "book_pages";

    SQLiteDatabase mDatabase;

    myDatabaseClass(@Nullable Context context) {
        super ( context , DATABASE_NAME , null , DATABASE_VERSION );
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String query = " CREATE TABLE " + TABLE_NAME + " ( " + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_TITLE + " TEXT, " + COLUMN_AUTHOR + " TEXT, " + COLUMN_PAGES + " INTEGER);";
        db.execSQL ( query );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db , int oldVersion , int newVersion) {

        db.execSQL ( "DROP TABLE IF EXISTS " + TABLE_NAME );
        onCreate ( db );

    }

    //for inserting the data into table
    void addBook(String title , String name , String pages) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase (); //this method in use to write the data to our table
        ContentValues values = new ContentValues (); //it passs the value to our database table
        values.put ( COLUMN_TITLE , title );
        values.put ( COLUMN_AUTHOR , name );
        values.put ( COLUMN_PAGES , pages );
        long result = sqLiteDatabase.insert ( TABLE_NAME , null , values );

        if (result == -1) {
            Toast.makeText ( context , "failed" , Toast.LENGTH_SHORT ).show ();
        } else {

            Toast.makeText ( context , " success add book" , Toast.LENGTH_SHORT ).show ();
        }
    }

    //for showing the data to the UI
    Cursor readAllData() {
        String query = " SELECT * FROM " + TABLE_NAME ;
        SQLiteDatabase database = this.getReadableDatabase ();
        Cursor cursor= database.query ( TABLE_NAME,null,null,null,null,null,COLUMN_ID);
        if (database != null) {
            cursor = database.rawQuery ( query , null );
        }
        return cursor;
    }
//for update the data

    void upadteData(String row_id , String row_title , String row_author , String row_pages) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase ();
        ContentValues contentValues = new ContentValues ();
        contentValues.put ( COLUMN_TITLE , row_title );
        contentValues.put ( COLUMN_AUTHOR , row_author );
        contentValues.put ( COLUMN_PAGES , row_pages );

        long result = sqLiteDatabase.update ( TABLE_NAME , contentValues , "_id=?" , new String[]{row_id} );
        if (result == -1) {
            Toast.makeText ( context , "Failed update" , Toast.LENGTH_SHORT ).show ();
        } else {
            Toast.makeText ( context , "update done" , Toast.LENGTH_SHORT ).show ();
        }

    }

    //for delete the data
    void deleteData(String row_id) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase ();
        long result = sqLiteDatabase.delete ( TABLE_NAME , "_id= ?" , new String[]{row_id} );

        if (result == -1) {
            Toast.makeText ( context , "Failed Delete" , Toast.LENGTH_SHORT ).show ();
        } else {
            Toast.makeText ( context , "deleted done" , Toast.LENGTH_SHORT ).show ();
        }
    }
}

这是我的适配器

package com.example.booklibrary;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textfield.TextInputLayout;
import java.util.ArrayList;

public class customAdapter extends RecyclerView.Adapter < customAdapter.MyViewHolder > implements PopupMenu.OnMenuItemClickListener {

    String delete_id, update_id, update_title, update_author, update_pages;
    Intent intent, inn;
    private Context context;
    AlertDialog alertDialog;
    private ArrayList < String > book__id, book__title, book__author, book__pages;


    public customAdapter(Context context , ArrayList < String > book__id , ArrayList < String > book__title , ArrayList < String > book__author , ArrayList < String > book__pages) {
        this.context = context;
        this.book__id = book__id;
        this.book__title = book__title;
        this.book__author = book__author;
        this.book__pages = book__pages;

    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent , int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from ( context );
        View view = layoutInflater.inflate ( R.layout.custom_adapter , null );
        return new MyViewHolder ( view );
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder , final int position) {
        holder.id.setText ( book__id.get ( position ) );
        holder.title.setText ( book__title.get ( position ) );
        holder.author.setText ( book__author.get ( position ) );
        holder.pages.setText ( book__pages.get ( position ) );

        holder.myLinerLayout.setOnLongClickListener ( new View.OnLongClickListener () {
            @Override
            public boolean onLongClick(View v) {



                //for delete the item
                delete_id = book__id.get ( position );
                update_id = book__id.get ( position );
                update_title = book__title.get ( position );
                update_author = book__author.get ( position );
                update_pages = book__pages.get ( position );

                longClickMenu ( v );

                return true;

            }
        } );

    }

    @Override
    public int getItemCount() {
        return book__id.size ();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView id, title, author, pages;
        RelativeLayout myLinerLayout;

        public MyViewHolder(@NonNull View itemView) {
            super ( itemView );

            id = itemView.findViewById ( R.id.item_id );
            title = itemView.findViewById ( R.id.item_title );
            author = itemView.findViewById ( R.id.item_AuthorName );
            pages = itemView.findViewById ( R.id.item_pages );
            myLinerLayout = itemView.findViewById ( R.id.item_linerLayout );


        }

    }

    private void longClickMenu(View view) // View must be pasing
    {
        PopupMenu popupMenu = new PopupMenu ( view.getContext () , view );
        popupMenu.inflate ( R.menu.popup_menu );
        popupMenu.setOnMenuItemClickListener ( customAdapter.this );
        popupMenu.show ();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId ()) {

            case R.id.edit_item:
                //context.startActivity ( intent );
                editButtonClick ();
                return true;

            case R.id.delete_item:
                Toast.makeText ( context , "click delete" , Toast.LENGTH_SHORT ).show ();
                myDatabaseClass myDatabaseClass = new myDatabaseClass ( context );
                myDatabaseClass.deleteData ( delete_id );
                Intent intent = new Intent ( context , MainActivity.class );
                context.startActivity ( intent );
                return true;

            default:
                return false;
        }

    }

    private void editButtonClick() {
        AlertDialog.Builder myDialog = new AlertDialog.Builder ( context );
        LayoutInflater layoutInflater = LayoutInflater.from ( context );
        View view = layoutInflater.inflate ( R.layout.add_data , null );
        myDialog.setView ( view );
        alertDialog = myDialog.create ();
        alertDialog.setCancelable ( true );
        final TextInputLayout updateTitle, updateAuthor, updatePages;
        updateTitle = view.findViewById ( R.id.Title );
        updateAuthor = view.findViewById ( R.id.Auther );
        updatePages = view.findViewById ( R.id.pages );
        updateTitle.getEditText ().setText ( update_title );
        updateAuthor.getEditText ().setText ( update_author );
        updatePages.getEditText ().setText ( update_pages );
        Log.d ( "update thing " , update_id );
        Button updatebutton = view.findViewById ( R.id.addButton );
        updatebutton.setOnClickListener ( new View.OnClickListener () {
            @Override
            public void onClick(View v) {
                myDatabaseClass myDatabaseClass = new myDatabaseClass ( context );
                myDatabaseClass.upadteData ( update_id , updateTitle.getEditText ().getText ().toString () , updateAuthor.getEditText ().getText ().toString () , updatePages.getEditText ().getText ().toString () );
                inn = new Intent ( context , MainActivity.class );
                context.startActivity ( inn );
            }
        } );
        alertDialog.show ();
    }

 }

【问题讨论】:

    标签: java android sql xml


    【解决方案1】:

    您可以使用notifyDataSetChanged();

    在您的工厂中单击添加此

    customAdapter.notifyDataSetChanged();
    

    删除行使用

    book_id.remove(position);
    notifyItemRemoved(position);                 
    notifyItemRangeChanged(position, book_id.size());
    

    就是这样

    更新:

                package com.example.booklibrary;
    
            import androidx.annotation.Nullable;
            import androidx.appcompat.app.AlertDialog;
            import androidx.appcompat.app.AppCompatActivity;
            import androidx.appcompat.widget.Toolbar;
            import androidx.recyclerview.widget.LinearLayoutManager;
            import androidx.recyclerview.widget.RecyclerView;
    
            import android.content.Intent;
            import android.database.Cursor;
            import android.database.sqlite.SQLiteDatabase;
            import android.os.Bundle;
            import android.view.LayoutInflater;
            import android.view.Menu;
            import android.view.MenuInflater;
            import android.view.MenuItem;
            import android.view.View;
            import android.widget.Button;
            import android.widget.EditText;
            import android.widget.ImageView;
            import android.widget.RelativeLayout;
            import android.widget.SearchView;
            import android.widget.TextView;
            import android.widget.Toast;
    
            import com.google.android.material.dialog.MaterialAlertDialogBuilder;
            import com.google.android.material.floatingactionbutton.FloatingActionButton;
            import com.google.android.material.snackbar.Snackbar;
            import com.google.android.material.textfield.TextInputLayout;
    
            import java.util.ArrayList;
    
            public class MainActivity extends AppCompatActivity {
    
                RecyclerView recyclerView;
                FloatingActionButton fltButn;
                AlertDialog alertDialog;
                SQLiteDatabase mDatabsae;
                myDatabaseClass myDatabaseClass;
                ArrayList < String > book__id, book__title, book__author, book__pages;
                customAdapter customAdapter;
                RelativeLayout forsnackbar;
                ImageView empty_image , main_Search ,showoff_Search;
                TextInputLayout search_text;
                TextView empty_textView;
    
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate ( savedInstanceState );
                    setContentView ( R.layout.activity_main );
                    forsnackbar = findViewById ( R.id.main_relative );
    
    
                    //for emptyIamge View
                    empty_image  = findViewById ( R.id.empty_imageView );
                    empty_textView =findViewById ( R.id.empty_textView );
    
                    //for search
                    main_Search = findViewById ( R.id.main_search );
                    search_text =  findViewById ( R.id.search_editText );
    
                    //for showoffSearch
                    showoff_Search = findViewById ( R.id.showoff_search );
                    showoff_Search.setOnClickListener ( new View.OnClickListener () {
                        @Override
                        public void onClick(View v) {
                            showoff_Search.setVisibility ( View.GONE );
                            main_Search.setVisibility ( View.VISIBLE );
                            search_text.setVisibility ( View.VISIBLE );
                        }
                    } );
    
                    //recyclerView
                    recyclerView = findViewById ( R.id.recyclerView );
                    recyclerView.setLayoutManager ( new LinearLayoutManager ( MainActivity.this ) );
    
    
                    myDatabaseClass = new myDatabaseClass ( MainActivity.this );
                    book__id = new ArrayList <> ();
                    book__title = new ArrayList <> ();
                    book__author = new ArrayList <> ();
                    book__pages = new ArrayList <> ();
    
                    //method for showing data into UI
                    showDataToUi ();
                    customAdapter = new customAdapter ( this , book__id , book__title , book__author , book__pages );
                    recyclerView.setAdapter ( customAdapter );
                    //floatingAction button
                    fltButn = findViewById ( R.id.addFloating );
                    fltButn.setOnClickListener ( new View.OnClickListener () {
                        @Override
                        public void onClick(View view) {
                            // Toast.makeText ( MainActivity.this , "Hello" , Toast.LENGTH_SHORT ).show ();
                            fabButtonClick ();
                        }
                    } );
    
    
                }
    
    
                private void fabButtonClick() {
                    MaterialAlertDialogBuilder myDialog = new MaterialAlertDialogBuilder ( this );
                    LayoutInflater layoutInflater = LayoutInflater.from ( this );
                    View view = layoutInflater.inflate ( R.layout.add_data , null );
                    myDialog.setView ( view );
                    alertDialog = myDialog.create ();
                    alertDialog.setCancelable ( true );
    
    
                    final TextInputLayout title,author, pages;;
                    Button addButton;
                    title = view.findViewById ( R.id.Title );
                    author = view.findViewById ( R.id.Auther );
                    pages = view.findViewById ( R.id.pages );
    
    
                    addButton = view.findViewById ( R.id.addButton );
                    addButton.setOnClickListener ( new View.OnClickListener () {
                        @Override
                        public void onClick(View v) {
    
                            String bookTitle = title.getEditText ().getText ().toString ().trim ();
                            String bookAuthor = author.getEditText ().getText ().toString ().trim ();
                            String bookPages =  pages.getEditText ().getText ().toString ().trim () ;
    
                            if(bookTitle.equals ( "" ))
                            {
                                title.setError ( "Required Field" );
                            }
                            else if(bookAuthor.equals ( "" ))
                            {
                                author.setError ( "Required Field" );
                            }
                            else if(bookPages.equals ( "") )
                            {
                                pages.setError (  "Required Field");
                            }
                            else {
                            myDatabaseClass myDatabaseClass = new myDatabaseClass ( MainActivity.this );
                            myDatabaseClass.addBook ( bookTitle , bookAuthor , bookPages );
                            alertDialog.dismiss ();
            //                Intent intent = new Intent ( getApplicationContext () , MainActivity.class );
            //                startActivity ( intent );
                                Snackbar.make ( forsnackbar,"Added",Snackbar.LENGTH_SHORT ).show ();
    
                            //Added
                            showDataToUi
                            customAdapter.notifyDataSetChanged();
    
                        }
                    } });
                    alertDialog.show ();
                    //.getWindow().setLayout(1200, 900); - this work when we use a simple AlerrtDialog
    
                }
    
                private void showDataToUi() {
                    Cursor cursor = myDatabaseClass.readAllData ();
                    if (cursor.getCount () == 0) {
                        Toast.makeText ( this , "No data" , Toast.LENGTH_SHORT ).show ();
                        empty_textView.setVisibility ( View.VISIBLE );
                        empty_image.setVisibility ( View.VISIBLE );
                    } else {
                        while ((cursor.moveToNext ())) {
                            book__id.add ( cursor.getString ( 0 ) ); //here add() function is from ArrayList
                            book__title.add ( cursor.getString ( 1 ) );
                            book__author.add ( cursor.getString ( 2 ) );
                            book__pages.add ( cursor.getString ( 3 ) );
                        }
                        empty_textView.setVisibility ( View.GONE );
                        empty_image.setVisibility ( View.GONE );
                    }
                }
    
    
    
            }
    

    【讨论】:

    • 在您的适配器中的 delete_item 但您必须在其上以及在 onBindViewHolder 中添加位置变量
    • 但是先生,我将代码放在 onBindViewHolder 但我们如何设置删除按钮?因为如果我们在 onBind 中添加代码,那么当我们点击项目时它会删除代码。
    • 不,您可以在删除按钮中添加该代码,但确保提供 int 位置,您可以使用全局变量并分配它
    • 先生,我正在尝试,但这不起作用。我如何在全局变量中存储位置?
    • 就像 update_id 变量,但将其设为 int 并将其分配给位置,this.position = onBindViewHolder 中的位置
    【解决方案2】:

    @杰森

    这是我的 Fab 按钮点击代码,但是当我们添加新数据时,recyclerView 并没有改变。

     //floatingAction button
            fltButn = findViewById ( R.id.addFloating );
            fltButn.setOnClickListener ( new View.OnClickListener () {
                @Override
                public void onClick(View view) {
                    // Toast.makeText ( MainActivity.this , "Hello" , Toast.LENGTH_SHORT ).show ();
                    fabButtonClick ();
                    customAdapter.notifyDataSetChanged();
                }
            } );
    

    这是我在适配器类中的删除按钮代码

    case R.id.delete_item:
                    Toast.makeText ( context , "click delete" , Toast.LENGTH_SHORT ).show ();
                    myDatabaseClass myDatabaseClass = new myDatabaseClass ( context );
                    myDatabaseClass.deleteData ( delete_id );
    
                    book__id.remove (postionForDelete);
                    notifyItemRemoved(postionForDelete);
                    notifyItemRangeChanged(postionForDelete, book__id.size());
                    notifyDataSetChanged ();
                    return true;
    

    此代码粘贴在 onBindViewHolder 类中,将位置存储到 postionForDelete var。但它删除了其他 id 数据。

    this.postionForDelete =  position;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2022-01-19
      • 2018-10-14
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多